Bài tập về "Cấu trúc lặp"

Các bài tập về các vòng lặp for, while, do..while
Mục lục
 1  2  3  4  5  6  7  8  9 10 
11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 
31 32

Viết các chương trình:

  1. Tính n!, với n là một số nguyên dương.
    Nhập n: 4
    4! = 24
    

    Gợi ý: rõ ràng cần phải lặp để tính n!. Ở đây số lần lặp là biết trước do đó nên sử dụng for. Cần 1 biến nguyên để lưu kết quả (n!). Biến kết quả này được khởi tạo bằng 1 sau đó cho một biến i (kiểu nguyên) chạy từ 2 đến n, với mỗi i cứ "nhân dồn" vào giá trị của biến kết quả.

  2. Tính n!, với n là một số nguyên dương.
    Nhập n: 4
    4! = 1*2*3*4 = 24
    

    Gợi ý: tương tự như bài 1, tuy nhiên, có khác với bài 1 ở chỗ: ở bài 1 có thể tách biệt việc tính toán và hiển thị thành 2 bước riêng biệt (tính toán trước sau đó hiển thị), còn ở bài 2, do trong kết quả phải hiển thị khai triển của biểu thức n! nên trong quá trình tính toán phải xen vào phần hiển thị.

  3. Tìm tất cả các ước số của một số nguyên dương n.
    Nhập số nguyên dương: 6
    Các ước số của 6 là: 1 2 3 6
    

    Gợi ý: phải lặp để duyệt tất cả các số nguyên dương nhỏ hơn hoặc bằng n (nên sử dụng vòng lặp for vì biết trước số lần lặp). Với mỗi lần lặp, kiểm tra số hiện tại là ước của n thì xuất ra màn hình.

  4. Tìm tất cả các phương án kết hợp 3 loại giấy bạc 100đ, 200đ, 500đ với nhau để cho ra số tiền 10000đ.
    Phương án    1: 0 tờ 100đ,  5 tờ 200đ, 18 tờ 500đ
    Phương án    2: 0 tờ 100đ, 10 tờ 200đ, 16 tờ 500đ
    …
    Phương án 537: 98 tờ 100đ,  1 tờ 200đ,  0 tờ 500đ
    

    Gợi ý: trước tiên ta có nhận xét rằng trong mỗi phương án, mỗi tờ bạc mệnh giá a đồng chỉ có thể có số lượng tối thiểu là 0 và số lượng tối đa là 10000/a. Từ nhận xét này, ta có cách đơn giản nhất là duyệt tất cả các phương án có thể bằng cách sử dụng 3 vòng lặp for lồng nhau, mỗi vòng for tương ứng với số tờ của mỗi loại tiền. Với mỗi khả năng, chỉ đơn giản kiểm tra xem tổng mệnh giá có bằng 10000đ hay không. Nếu bằng thì hiển thị ra màn hình và tiếp tục kiểm tra các khả năng khác.

  5. Trả lời câu hỏi sau bằng cách duyệt tất cả các cách có thể để tìm kết quả:
    Yêu nhau cau sáu bổ ba
    Ghét nhau cau sáu bổ ra làm mười
    Mỗi người một miếng trăm người
    Có mười bảy quả hỏi người ghét yêu.
    Đáp án: có .. người thương và .. người ghét

    Thông tin: mỗi quả cau, thông thường các cụ bổ sáu, nghĩa là chia làm sáu phần bằng nhau. Chừng này là đủ để nhóm nhém một buổi. Tuy nhiên, khi yêu thì thường muốn ưu tiên cho người mình yêu nhiều hơn 1 tí nên bổ làm ba thôi. Còn khi ghét thì chỉ cho một phần mười :)

    Gợi ý: có thể giải bài này bằng hệ phương trình bậc nhất với 2 ẩn là g (số người ghét), và y (số người yêu). Tuy nhiên, để tập cách sử dụng vòng lặp khi lập trình thì ta có thể làm bằng cách duyệt tất cả các khả năng có thể, phương án nào đúng thì hiển thị ra màn hình. Ví dụ, khả năng (x=0, y=0) không đúng, khả năng (x=0, y=1) không đúng, khả năng (x=0, y=2) không đúng, cứ thử như vậy, đến một ngày đẹp trời sẽ tìm thấy!

  6. Tìm phương án tối ưu (số tờ tiền là ít nhất) kết hợp 3 loại giấy bạc 100đ, 200đ, 500đ với nhau để cho ra số tiền 10000đ.
    Phương án tối ưu: 1 tờ 100đ, 2 tờ 200đ, 19 tờ 500đ
  7. Kiểm tra xem một số nguyên dương n có là số nguyên tố hay không?
    Nhập số nguyên dương: 23
    23 là một số nguyên tố
    
  8. Kiểm tra xem một số nguyên n ≥ 2 có phải là số nguyên tố hay không? Nếu không phải là số nguyên tố (hợp số) thì đưa ra một ví dụ (tích của a*b trong đó a, b khác 1 và n) để chứng minh.
    Nhập số nguyên dương: 23
    23 là một số nguyên tố
    
    Nhập số tự nhiên: 15
    15 là hợp số vì 15 = 3*5
    
  9. Tìm các số nguyên tố nhỏ hơn một số nguyên dương n cho trước.
    Nhập số nguyên dương: 11
    Các số nguyên tố nhỏ hơn 11 là: 2 3 5 7
    
  10. Kiểm tra xem một số nguyên dương n có phải là số chính phương không?
    Nhập số nguyên dương: 14
    14 không là một số chính phương
    
    Nhập số nguyên dương: 25
    25 là môt số chính phương vì 25 = 5*5
    
  11. Kiểm tra xem một số nguyên dương n có phải là số hoàn hảo hay không? (Số hoàn hảo là số có tổng tất cả các ước số bằng hai lần chính nó).
    Nhập số nguyên dương: 6
    6 là một số hoàn hảo
    
  12. Đếm xem số tự nhiên n có bao nhiêu chữ số.
    Nhập số tự nhiên: 1420
    Số chữ số của 1420 là 4 
    
  13. Hiển thị các chữ số của một số tự nhiên n theo thứ tự từ phải sang trái.
    Nhập số tự nhiên: 1420
    Các chữ số của 1420 lần lượt là 0 2 4 1 
    
  14. Tính tổng của các chữ số của một số tự nhiên n.
    Nhập số tự nhiên: 1420
    Tổng các chữ số của 1420 là 7 
    
  15. Tìm chữ số lớn nhất của một số tự nhiên n.
    Nhập số tự nhiên: 1420
    Chữ số lớn nhất của 1420 là 4 
    
  16. Kiểm tra xem một số nguyên dương n có phải là số Amstrong hay không? (Một số được gọi là số Amstrong nếu ).
    Nhập số nguyên dương: 153
    153 là một số Amstrong
    
  17. Tìm ước số chung lớn nhất và bội số chung nhỏ nhất của hai số nguyên dương a, b.
    Nhập hai số nguyên dương: 6 9
    Ước số chung lớn nhất của 6 và 9 là 3
    Bội số chung nhỏ nhất của 6 và 9 là 18
    
  18. Đọc một số tự nhiên.
    Nhập số tự nhiên: 1410
    Đọc là: một bốn một không
    
  19. Lấy ra chữ số ở vị trí nào đó (tính từ phải sang trái) của một số tự nhiên.
    Nhập số tự nhiên: 1410
    Bạn muốn lấy chữ số ở vị trí nào thứ:3
    Chữ số ở vị trí thứ 3 (từ phải sang trái) của số 1410 là : 4
    
  20. Lấy ra chữ số ở vị trí nào đó (tính từ trái sang phải) của một số tự nhiên.
    Nhập số tự nhiên: 1410
    Bạn muốn lấy chữ số ở vị trí nào thứ:3
    Chữ số ở vị trí thứ 3 (từ trái sang phải) của số 1410 là : 1
    
  21. Liệt kê các số hoàn hảo nhỏ hơn 9000. Số hoàn hảo là số có tổng các ước số của nó (không kể nó) bằng chính nó. Ví dụ: số 6 là số hoàn hảo vì tổng các ước số là 1+2+3=6.
    Các số hoàn hảo nhỏ hơn 9000 là: 6 28 496 8128
  22. Liệt kê tất cả các số có 3 chữ số sao cho tổng lập phương của các chữ số bằng chính số đó.
    153 370 371 407
  23. In ra bảng cửu chương từ 5 đến 9.
     5 x  1 =  5 |  6 x  1 =  6 |  7 x  1 =  7 |  8 x  1 =  8 |  9 x  1 =  9 |
     5 x  2 = 10 |  6 x  2 = 12 |  7 x  2 = 14 |  8 x  2 = 16 |  9 x  2 = 18 |
     5 x  3 = 15 |  6 x  3 = 18 |  7 x  3 = 21 |  8 x  3 = 24 |  9 x  3 = 27 |
     5 x  4 = 20 |  6 x  4 = 24 |  7 x  4 = 28 |  8 x  4 = 32 |  9 x  4 = 36 |
     5 x  5 = 25 |  6 x  5 = 30 |  7 x  5 = 35 |  8 x  5 = 40 |  9 x  5 = 45 |
     5 x  6 = 30 |  6 x  6 = 36 |  7 x  6 = 42 |  8 x  6 = 48 |  9 x  6 = 54 |
     5 x  7 = 35 |  6 x  7 = 42 |  7 x  7 = 49 |  8 x  7 = 56 |  9 x  7 = 63 |
     5 x  8 = 40 |  6 x  8 = 48 |  7 x  8 = 56 |  8 x  8 = 64 |  9 x  8 = 72 |
     5 x  9 = 45 |  6 x  9 = 54 |  7 x  9 = 63 |  8 x  9 = 72 |  9 x  9 = 81 |
    

    Gợi ý: để hiển thị được như trên cần phải "lặp", mà số lần lặp đã biết trước (9 hàng, 5 cột) nên sẽ dùng cấu trúc for: một vòng lặp for để duyệt các cột, một vòng lặp for khác để duyệt các hàng, hai vòng for này phải lồng nhau. Vấn đề ở đây là sẽ duyệt từng hàng sau đó trong mỗi hàng duyệt từng cột:

    for (hang=1; hang<=9; hang++)
        for (cot=5; cot<=9; cot++)
        {
            blah blah
        }
    

    hay sẽ duyệt từng cột sau đó trong mỗi cột duyệt từng hàng:

    for (cot=5; cot<=9; cot++)
        for (hang=1; hang<=9; hang++)
        {
            blah blah
        }
    

    Sẽ để dành phần này cho mọi người :) Một chú ý trong việc can chỉnh sao cho thẳng hàng thẳng lối: khi hiển thị một mục (ví dụ: 9 x 5 = 45), nên sử dụng trường width trong phần tử định dạng (ví dụ: %3d).

  24. Vẽ hình chữ nhật đặc kích thước m×n bằng các dấu *.
    Nhập m, n: 4 5
    * * * * *
    * * * * *
    * * * * *
    * * * * *
    

    Gợi ý: để hiển thị mỗi ô của hình chữ nhật, chỉ đơn giản sử dụng hàm printf("* "). Trên mỗi hàng, số ô là biết trước (n cột) nên sử dụng cấu trúc lặp for. Hết một hàng thì printf("\n") để xuống hàng. Và cứ lặp lại việc này trên m hàng sẽ có được hình chữ nhật. Số hàng cũng đã biết trước nên cũng sử dụng cấu trúc for. Như vậy, một cách giải của bài này là sử dụng hai vòng for lồng nhau.

  25. Vẽ hình chữ nhật rỗng kích thước m×n.
    Nhập m, n: 4 5
    * * * * *
    *       *
    *       *
    * * * * *
    

    Gợi ý: một cách làm là tương tự như câu trên, tuy nhiên tại mỗi ô, không phải lúc nào cũng printf("* ") mà với những ô phía trong thì printf(" "). Nghĩa là lệnh thì như bài trên, chỉ thêm vào lệnh if để kiểm tra ô hiện tại là ở trong hay ở biên của hình chữ nhật.

  26. Vẽ tam giác vuông cân đặc có độ dài của cạnh là a.
    Nhập độ dài của cạnh: 4
    *
    * *
    * * *
    * * * *
    

    Gợi ý: một cách làm là xem tam giác này như là một nữa (trái dưới) của hình chữ nhật và cứ duyệt tất cả các ô của hình chữ nhật như 2 câu trên. Với mỗi ô, kiểm tra xem chỉ số hàng có ≤ chỉ số cột không, nếu đúng thì hiển thị dấu * ngược lại thì hiển thị khoảng trắng. Nghĩa là chèn thêm một lệnh if ngay sau hai vòng lặp for lồng nhau. Cách này không tối ưu ở chỗ phải duyệt nhiều ô không cần thiết. Cách khác tối ưu hơn là vẫn cứ duyệt từng hàng, nhưng với mỗi hàng (ví dụ hàng i) thì chỉ cần duyệt các cột từ 1 đến i là đủ.

  27. Vẽ tam giác cân có chiều cao h.
    Nhập chiều cao tam giác: 4
    *
    * * *
    * * * * *
    * * * * * * *
    
  28. Vẽ tam giác cân rỗng có chiều cao h.
    Nhập chiều cao tam giác: 4
          *
        *   *
      *       *
    * * * * * * *
    
  29. * Liệt kê tất cả các số Fibonacci nhỏ hơn hoặc bằng số tự nhiên n. Dãy số Fibonacci được định nghĩa như sau:
    Nhập n: 20
    1 1 2 3 5 8 13
    
  30. * Tính sin⁡(x) với độ chính xác 0.01 (x tính theo độ).
    Biết với x tính theo radian.
    Nhập góc (theo độ): 30
    sin(30) = 0.5
    
  31. * Tính cos⁡(x) với độ chính xác 0.01 (x tính theo độ).
    Biết với x tính theo radian.
    Nhập góc (theo độ): 30
    cos(60) = 0.5
    
  32. * Tính π với độ chính xác đến n chữ số sau dấu chấm thập phân,
    Biết .
    Độ chính xác (số chữ số sau dấu chấm thập phân): 3
    PI = 3.142
    
    Độ chính xác (số chữ số sau dấu chấm thập phân): 4
    PI = 3.1416
    

Tải về (pdf)

Bình luận (14)

Viết Bình luận
  • Binh
    Bai tap 24

    # include <stdio.h>
    void main ()
    {
    int i;
    int j;
    for(j=1;j<=5;j++)
    { for(i=1;i<=5;i++)
    printf("@ ");
    printf("\n");
    }
    }

  • tuan anh
    bai2

    #include
    #include
    #include
    main()
    {
    int i,n,giaithua;
    printf("nhap vao so n:");
    scanf("%d",&n);
    giaithua=1;
    i=1;
    printf("%d! =", n);
    printf("1*");
    while(i<=n)
    {
    giaithua=giaithua*i;
    i=i+1;
    if(i<=(n-1))
    printf("%d*",i);

    }
    printf("%d",n);
    printf("=%d",giaithua);
    getch();

  • tuan anh
    bai4

    ai giup minh lam bai 4 dc ko

  • duyen
    bài tập 2

    em nhập n=9 thầy ạ. Thầy xem giúp em nhá. Hjjj em cứ tưởng không để ghép n<=o được. Thanks thầy ạ.

  • @duyen

    ctr của e đúng rồi mà. Khi chạy e nhập n bằng mấy?

    CÝ: dòng 11 nên sửa lại thành

    while (n<=0);

     

  • duyen
    Bài Tập 2
    #include<stdio.h>
    #include<conio.h>
    void main()
    {
    int n,i,gt;
    do
    {
       printf("nhap n=");
       scanf("%d",&n);
    }
    while(n<0||n==0);
    gt=1;
    printf("%d!=1",n);
    for(i=2;i<=n;i++)
    {
        printf("*%d",i);
        gt=gt*i;
    }
    printf("=%d",gt);
    getch();
    }


    Em làm bài tập 2 như trên nhưng không hiểu sao khi cho chạy thì chương trình đưa ra kết quả là : -30336. Thầy giải đáp giúp em được không ạ???

    Chỉnh sửa lần cuối bởi nhat [17/01/2012 15:58]
  • ngocvq
    bai 7
    #include<stdio.h>
    #include<conio.h>
    int main()
    {
    	int i, n ;
    	i = n/2; //lúc này đã nhập n đâu! Fải đưa lui sau scanf
    	printf("Nhap so nguyen duong:");
    	scanf("%d", &n);
    		do //cố gắng tìm i nào đó chia hết n, tìm thấy thì dừng ngay
    		{
    			n % i ; //dòng này ko có ý nghĩa, --> if (n%i==0) break;
    			i--;
    		}while (i > 2); //--> (i>=2)
    		if (n%i != 0) //-->(i==1) nghĩa là ko tìm thấy i nào
    			printf("So %d la so nguyen to.\n", n);
    		else 
    			printf("So %d khong phai so nguyen to.\n", n);
    		return 0;
    }

     T: xem phần comment

    Chỉnh sửa lần cuối bởi nhat [08/12/2011 20:47]
  • ngocvq
    bai 2

    Thầy ơi , bài 2 này hay thật đấy ,giúp em hiểu về thủ thuật in ra màn hình rất thú vị :

    #include<stdio.h> 
    #include<conio.h> 
    main() { 
       int n ,i , Giai_thua ; 
       Giai_thua = 1 ; 
       printf("Nhap n: "); scanf("%d", &n); 
    
       printf("%d! =", n); 
       printf("1"); 
       //nên nhập 2 dòng trên thành: printf("%d! = 1", n); 
       for ( i = 2; i <= n; i++) printf("*%d", i); 
    
       if (n) // <=> (n>0), một số người ko rõ cái này
       { 
          printf("="); 
          for (i = n; i > 0; i--) 
             Giai_thua = Giai_thua * i; 
          printf(" %d.\n", Giai_thua); //--> printf(" = %d.\n", Giai_thua); 
       } 
       else printf("0! = %d.\n", 1); //coi lại, bị thừa!
    
       return 0; 
    }
    

    T: xem comment

    Chỉnh sửa lần cuối bởi nhat [08/12/2011 20:58]
  • @Lam: Câu 23 (hiển thị bảng cửu chương)

    Bạn xem phần gợi ý. T mới đưa vào.

  • @Ha

    If lồng nhau cũng là If mà!?

    Chú ý: nhiều if lồng nhau có thể đưa về 1 if, ví dụ:

    if (x==1)

    {

       if (y==2)

      {

           ...

       }

    }

    có thể viết lại:

    if (x==1 && y==2)

    {

        ...

    }

  • ha
    cho e hoj
    thay oi, o cau 6,sao mjnh ko dung if ha thay? neu dung if long nhau cung dc ma
  • do viet lam
    THU HOI
    cho em biet cach giai cau 23 di
  • @Hiếu

    Một số bài mình chỉ đưa gợi ý để giải thôi bạn ah. Vì các bt này có mục đích là học. Còn bt có lời giải thì chắc là không thiếu trên internet. Bạn thông cảm nhé :)

  • Ngô Văn Hiếu
    Cách giải sao bạn.
    Bạn ơi.Cho mình hỏi cách giải đi

Viết Bình luận

Đã đóng bình luận