Chủ Nhật, 20 tháng 1, 2013

Tổng hợp bài tập nhập môn Công Nghệ Thông Tin

Qua một học kỳ làm sinh viên đại học, Dũng đã có rất nhiều bỡ ngỡ về môi trường ở đại học. Bài tập nhiều hơn, mức độ yêu cầu cao hơn, đề cao thái độ tự học hơn ...v...v. Tuy nhiên bằng sự nỗ lực hết sức của mình Dũng đã hoàn thành các bài tập được giao một cách tốt nhất có thể. Cụ thể sau đây  là link download folder tổng hợp những bài tập nhập môn Công Nghệ Thông Tin mà Dũng đã hoàn thành trong suốt học kỳ I, năm học 2012-2013.
Link mediafire: http://www.mediafire.com/?pv92ad088ak4m
Link dropbox: https://www.dropbox.com/sh/2qpw1sigxoihy8a/xCoyI3wBVY

Thứ Hai, 3 tháng 12, 2012

Bài tập 03


Đề bài: Tính F(x)
Cho hàm F(x), x ≥ 0 được định nghĩa như sau:
F(x) = x, nếu x ≤ 9
F(x) = F(S(x)), nếu x > 9
Trong đó S(x): tổng các chữ số của x.
Yêu cầu: Hãy viết chương trình tính F(n!), với 1 <= n <= 500.
Phân tích:
Ta có : n! = 1.2.3…n
Dễ thấy rằng các số từ 6! trở đi đều chia hết cho 9 vì 6!= 1.2.3.4.5.6= 720
Và giai thừa của các số sau 6 cũng chia hết cho 9 do có chứa 6!:
Vd
7!= 6!*7 chia hết cho 9
11!= 6!*7*8*9*10*11 chia hết  cho 9
Mà 1 số N chia hết cho 9 thì tổng các chữ số tạo nên số đó cũng chia hết cho 9 ta gọi là N1, mà N1  chia hết cho 9 nên tổng các chữ số tạo nên N1 cũng chia hết cho 9……..đến Nn có <= 9, dựa vào  định nghĩa :
F(x) = x, nếu x ≤ 9
F(x) = F(S(x)), nếu x > 9
Suy ra :  1<= x <=9  , mà một số có tổng các chữ số chia hết cho 9  có 1 chữ số là 9.
Vd:
8!= 40320  chia hết cho 9 và  tổng các chữ số(4+3+2+0) bằng 9.
F(8!) = 40320  với S(8!)= 9  -> F(S(8!))= F(9) = 9.
Vậy bài toán trở nên đơn giản với:
-    1<= n<= 5: F(n!)= 1 ; 2; 6; 6; 3
-       n >=6: F(n!)=9
Code   (phần code này mình tham khảo tuy nhiên vẫn còn vài chỗ khó hiểu, mình sẽ cố gắng suy nghĩ để hiểu sâu hơn)
void main()
{
   int n, fn;
   do
   {
      printf("Nhap n : ");
      scanf("%d", &n);
   }
   while (n<1|| n>500);
   switch (n)
   {
      case 1: fn = 1; break; 
      case 2: fn = 2; break;
      case 3: 
      case 4: fn = 6; break;
      case 5: fn = 3; break;
         default: fn = 9; break;
   }
   printf("F(%d!)= %d\n",n,fn);
}

Bài 2


Đề bài: Xem công thức tính sau đây (đề thi tuyển sinh cao học ngành KHMT, năm 2011):

Trong đó MaxMin lần lượt là giá trị lớn nhất, nhỏ nhất của số thực (được nhập vào từ thiết bị nhập chuẩn) a0, a1, …, an-1.
Chỉ dùng duy nhất 1 vòng lặp (for hoặc while), đề xuất cách thức để nhập số thực như trên và tính giá trị của biểu thức Aver, xuất kết quả tính ra thiết bị xuất chuẩn. Viết chương trình để minh họa đề xuất đó.
Lưu ý: Phần này sinh viên chưa học về mảng, như vậy vấn đề chính của bài toán này là không thể dùng mảng để lưu giá trị của số thực nói trên. Như vậy phải đề xuất một giải pháp “thông minh” để nhập và tính toán mà không đưa trước các số thực này vào mảng.
Phân Tích:
Với bài toán này ta thấy nó có vẻ rườm rà, rắc rối vì Max, Min  chạy theo a với i=0 tới
(n-1). Nhưng khi ta phân tích công thức ta  thấy:
Aver =  2.a*a(i=0 –n-1)  - 4a(i=0 –n-1)+ nMax2 + nMin + Max + Min -nMaxMin
= 2..a*a(i=0 –n-1)  - 4a(i=0 –n-1) + 3n/2(Max2 + Min2) – nMaxMin (1)
Vậy ta chỉ cần tìm :
-   Tổng các số ađến an
-   Tổng bình phương các số từ ai đến an
-   Tìm Max, Min.
–> Áp dụng vào (1) ta tính được aver
Code:
+  Tính max, min, tổng, tổng bình phương:
 float tinhTong(float &max, float &min, float &s1, float &s2, int n ) // tính tong, tong binh phuong, max, min
 {
 float a1;
float a;
int i;
s2=0;
printf("Nhap phan tu thu 0 : ");
scanf("%f",&a1);
max = a1;
min = a1;
printf(" Nhap tat ca cac phan tu: \n");
for (i=0; i<= n-1; i++)
{
printf("Phan tu thu %d : ",i);
scanf("%f",&a);
s1 = s1 + a;
s2 = s2 + a*a;
if (a > max)
      max= a;
if (a< min)
      min = a;
}
return s1;
}

Bài tập 01


Đề bài 1: 
Cho số tự nhiên A. Hãy tìm số tự nhiên N nhỏ nhất sao cho N lũy thừa N (nhân N cho chính nó N lần) chia hết cho A. Hãy viết chương trình tìm số N đó và xuất ra màn hình. Trong đó A có giá trị: 1 ≤ A ≤ 109
Vd:
A=8 thì N=4
A=13 thì N=13
Phân tích:
Chúng ta đều biết mỗi một số  tự nhiên đều phân tích được thành tích của các thừa số nguyên tố. Để  NN chia hết cho A thì Nn cũng  phải chứa các thừa số nguyên tố tạo nên A. Mặc khác số yêu cầu tìm là Nn do đó N chỉ cần chứa các thừa số nguyên tố tạo nên A (gọi là M) , thoả :
TH1: M  >=  A à N chia hết cho A à NN chia hết cho A
Vd:
A = 6 = 2.3
N = M= 2.3
N chia hết cho A
TH2: M  < A
Vậy ta cần tìm một số i nào đó sao cho i*M là số nhỏ nhất  thoả: i*M = N và  Nn chia hết cho A.
Mà NN = (iM)iM do đó để tìm số N nhò nhất thoả yêu cầu thì iM >= max{ mũ của các thừa số nguyên tố trong A} (TH1 i=1).
Vd:
A = 8 = 23
M=2 < 8
Chọn i=2 à iM = N = 4 > 3 à NN = 4 chia hết cho 8
Kết luận:
Đầu tiên ta tìm số M chứa các thừa số nguyên tố có trong A.
Sau đó, là tìm số mũ cao nhất của thừa số của A.
Nếu M>= A:  N=M.
Nếu M<A:  tìm i sao cho iM > max {số mũ của thừa số nguyên tố trong A}.
Code: (Đây chỉ là đoạn code để phân tích vấn đề trên, không phải là một bài code hoàn chỉnh để chạy chương trình...)
....
long tinhM(long a)
{
    long m=1;int i=2;
    while (a>1)
    {
        while (a%i==0)
        {
             while (a%i==0)
             {
                 a=a/i;
             }
             m = m*i;
        }
        i=i+1;
    }
    return m;
}
int tinhSoMu(long a)
{
    int somu;int max=1;int i=2;
    while (a>1)
    {
        somu=0;
        while (a%i==0)
        {
            a= a/i;
            somu = somu+1;
        }
        if ( max< somu)
            max = somu;
         i=i+1;
    }
    return max;
}
int timi(long m, int somu)
{
    int i=1;
    while (m < somu)
    {
        if ((m*i) >= somu)
           break;
       i=i+1;
    }
    return i;
}
......