Trang 1 trên tổng số 6 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 60 kết quả

Đề tài: Bài tập giải thuật | Bài tập thuật toán cơ bản

  1. #1
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Smile Bài tập giải thuật | Bài tập thuật toán cơ bản

    1. Ý TƯỞNG THUẬT TOÁN
    • Xét 3 hệ số của phương trình trước hết xét a=0 hoặc a khác 0
    a. TH1 : a=0
    - Ta xét thêm b =0 hay khác 0 . Nếu a=0 mà b=0 thì phương trình không xác định . Nếu b khác 0 thì giải bài toán giống như giải phương trình bậc nhất .
    b. TH2 : a khác 0
    - Ta tính Delta và xét Delta đưa ra nghiệm của pt
    - Nếu Delta < 0 : Phương trình vô nghiệm
    - Nếu Delta = 0 : Phương trình có nghiệm kép
    - Nếu Delta > 0 : Phương trình có hai nghiệm phân biệt .
    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    • a , b ,c là ba hệ số của phương trình .
    • Delta là biến dùng để lưu giá trị Delta sau khi tính .
    • x1,x2 : là nghiệm của phương trình nếu pt có 2 nghiệm phân biệt
    • x : là nghiệm nếu phương trình chỉ có một nghiệm mà thôi
    3. BÀI GIẢI :
    C Code:
    1. #include<conio.h>
    2. #include<stdio.h>
    3. #include<math.h>
    4. void main ()
    5. {
    6.     clrscr();
    7.     float a,b,c,delta;
    8.     printf("ban hay nhap a,b,c vao ");
    9.     scanf("%f%f%f",&a,&b,&c);// cac he so cua pt bac 2
    10.     if (a!=0)
    11.     {
    12.       delta=b*b-4*a*c;
    13.         if (delta>0)
    14.         {
    15.             printf("phuong trinh  co 2 nghiem\n");
    16.             printf("x1=%f",(-b-sqrt(delta))/(2*a));
    17.             printf("\n");
    18.             printf("x2=%f",(-b+sqrt(delta))/(2*a));
    19.         }
    20.         else   //TH a<>0 va delta <=0
    21.         {
    22.             if (delta==0)
    23.             {
    24.                 printf("phuong trinh co nghiem kep\n");
    25.                 printf("x=%f",-b/(2*a));
    26.             }
    27.             else
    28.                 printf("phuong trinh vo nghiem ");
    29.         }
    30.     }
    31.     else    //  (If a==0)
    32.     {
    33.         if (b!=0)  // a luc nay =0
    34.         {
    35.             printf("phuong trinh co 1 nghiem\n");
    36.             printf("x=%f",-c/b);
    37.         }
    38.         else // a=0 va b=0
    39.         {
    40.             if (c!=0)
    41.                 printf("phuong trinh khong xac dinh");
    42.             else
    43.                 printf("phuong trinh vo so nghiem");
    44.         }
    45.     }
    46.     getch();
    47. }


    HẾT
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 29-09-2006 lúc 01:09 AM. Lý do: Hoàn chỉnh lại code

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Tìm thứ một ngày tháng bất kì

    BÀI 02

    1. Ý TƯỞNG THUẬT TOÁN :
    a. Ta làm một trường hợp nếu nhập vào không hợp lệ thì bắt nhập lại .
    b. Ngược lại
    Trước hết ta quy đổi về số ngày hết .
    Ta xét từ năm số 1 cho đến năm nhập vào nếu thỏa điều kiện năm nhuận thì cộng thêm 1
    Ta xét từ tháng 1 cho đến tháng nhập vào và lần lượt cộng với số ngày tương ứng mà tháng đó có ( ví dụ : tháng 3 có 31 ngày ).
    Sau khi được một tổng số có được bằng cách thực hiện 2 bước trên thì ta cộng số đó vào số ngày nhập vào . Ta được tổng số ngày từ ngày tháng năm thứ nhất cho đến ngày tháng năm hiện tại
    Theo quy luật của ngày tháng thì cứ 7 ngày thì lặp lại một thứ . Vì thế ta lấy tổng số ngày tính được tất cả chia lấy phân dư cho 7 ( Ví dụ : nếu được 0 thì đó là chủ nhật )
    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    Ba biến : ngay , thang ,nam là các biến được nhập vào
    Biến s : lúc đầu là cộng thêm 1 nếu gặp năm nhuần khi dòng for i chạy sau đó được gán bằng 0 và tính tổng các ngày của các tháng .
    Biến t : là biến tính tổng số ngày
    Biến x : là biến khi t chia lấy phần dư cho 7 gán cho x rồi suy ra thứ.
    Dòng For thứ nhất chạy xét xem nếu năm nhuần thì cộng số ngày lên 1
    Dòng For thứ hai chạy xét và cộng vào số ngày tương ứng của tháng đó .
    3. BÀI GIẢI
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  void main()
    4.  {
    5.     clrscr();
    6.     int ngay , thang , nam,s=0,x;
    7.     long t;
    8.     do
    9.     {
    10.         printf("Nhap vao Ngay :");
    11.         scanf("%d",&ngay);
    12.         printf("Nhap vao Thang :");
    13.         scanf("%d",&thang);
    14.         printf("Nhap vao Nam :");
    15.         scanf("%d",&nam);
    16.     } while(((ngay<0)||(ngay>31)||(thang<0)||(thang>12))||((thang==2)&&(ngay>29)));
    17.  
    18.     for(int i=1;i<=nam;i++)
    19.     {
    20.         if((i%400==0)||((i%4==0)&&(i%100!=0)))
    21.             s+=1;
    22.     }
    23.         t=(nam*365)+s;
    24.         s=0;
    25.     for(int j=1;j<thang;j++)
    26.     {
    27.         switch(j)
    28.         {
    29.             case 2:
    30.               if ((nam%400==0)||((nam%4==0)&&(nam%100!=0)))
    31. {
    32. s+=29;
    33.                     break;
    34.                 }
    35.                 Else
    36.                 {
    37.                     S+=28;
    38.                     Break;
    39.                 }
    40.             case 4:
    41.             case 6:
    42.             case 9:
    43.             case 11:
    44.                 s+=30;
    45.                 break;
    46.             Default:
    47.                 s+=31;
    48.                 break;
    49.         }
    50.     }
    51.         t+=s+ngay;
    52.     textcolor(6-9);
    53.     x=t%7;
    54.     printf("\n\n Ngay %d Thang %d Nam %d La Ngay ",ngay,thang,nam);
    55.     switch(x)
    56.     {
    57.         case 0:
    58.             cprintf("Chu Nhat ");
    59.             break;
    60.         case 1:
    61.             cprintf("Thu Hai ");
    62.             break;
    63.         case 2:
    64.             cprintf("Thu Ba ");
    65.             break;
    66.         case 3:
    67.             cprintf("Thu Tu ");
    68.             break;
    69.         case 4:
    70.             cprintf("Thu Nam ");
    71.             break;
    72.         case 5:
    73.             cprintf("Thu Sau ");
    74.             break;
    75.         case 6:
    76.             cprintf("Thu Bay ");
    77.             break;
    78.     }
    79.  
    80.     getch();
    81.  
    82.  }
    HẾT

  3. #3
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Tìm thứ tự của một ngày trong năm

    BÀI 03

    1. Ý TƯỞNG THUẬT TOÁN :
    Ta lấy số ngày xét nếu bằng 365 thì ngày 31 tháng 12 nam 0 , ngược lại thì ta lấy số ngày trừ cho 365 nếu là năm nhuận thì trừ cho 366
    Xét diều kiện đủ thấy ta lấy số ngày cịn l?i trừ cho số ngày của từng tháng ( ví dụ : lấy số ngày trừ cho 31 nếu lớn hơn 0 thì tháng +1 và có thể tiếp tục chạy theo vòng for cho đến khi nào không thỏa điều kiện trong vòng switch – case nữa thì thoát ra
    Thu được kết quả của ngày tháng năm .

    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    Trong bài chỉ có ba biến quan trọng là : ngay , thang , nam
    Biến ngay : là biến được input .
    Biến thang : là biến tăng khi ngày trừ đi theo câu lệnh
    Biến nam : tuong tự như biến tháng nhưng là kết quả của biến ngày trừ đi theo câu lệnh .
    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3.  
    4. void main()
    5. {
    6.     clrscr();// nam so 0 khong duoc xet la nam nhuan
    7.     unsigned long ngay,nam=1;
    8.     int thang=1;     //bat dau tu nam so 0
    9.     do
    10.     {
    11.         printf("Nhap vao so ngay : ");
    12.         scanf("%lu",&ngay);
    13.     }while(ngay<1);
    14.  
    15.     while(ngay>=366)//dieu kien de xet so nam
    16.     {
    17.  
    18.                 if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
    19.                     ngay-=366;
    20.                 else
    21.                     ngay-=365;
    22.                 nam++;
    23.                 if(ngay==0)
    24.                 {
    25.                     thang=12;
    26.                     ngay=31;
    27.                     nam-=1;
    28.                     break;
    29.                 }
    30.      }
    31.  
    32.  
    33.       while(ngay>=28)
    34.       {
    35.             if(thang==12)
    36.                 break;
    37.             switch(thang)
    38.             {
    39.                 case 1:
    40.                 case 3:
    41.                 case 5:
    42.                 case 7:
    43.                 case 8:
    44.                 case 10:
    45.                             if((ngay-31)>0)
    46.                             {
    47.                                 ngay-=31;
    48.                                 thang+=1;
    49.                             }
    50.                             break;
    51.  
    52.                 case 2:  if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
    53.                             {
    54.                                 if((ngay-29)>0)
    55.                                 {
    56.                                     thang+=1;
    57.                                     ngay-=29;
    58.                                 }
    59.                                 else
    60.                                     break;
    61.                             }
    62.                             else
    63.                             {
    64.                                 if((ngay-28)>0)
    65.                                  {
    66.                                     ngay-=28;
    67.                                     thang+=1;
    68.                                  }
    69.                                  else
    70.                                     break;
    71.                             }
    72.                             break;
    73.                 default :
    74.                             if((ngay-30)>0)
    75.                             {
    76.                                 thang+=1;
    77.                                 ngay-=30;
    78.                             }
    79.                             break;
    80.             }
    81.         }
    82.    
    83.     printf("\n Doi ra ngay thang la ");
    84.     printf("%lu - %d - %d",ngay,thang,nam);
    85.     getch();
    86. }
    HẾT

  4. #4
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Tìm thứ tự của một ngày trong năm theo tháng trước

    BÀI 04 :

    1. Ý TƯỞNG THUẬT TOÁN :
    Bài này cũng tương tự như hai bài trên nhưng ta lại xét tháng trước nó sẽ nhanh hơn. Nếu tháng hợp lệ thì ta xét năm và ngày
    2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
    • Trong bài này cũng chỉ có 3 biến: ngay , thang ,nam Cả 3 biến này đều là biến input
    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. void main()
    4. {
    5.     clrscr();
    6.     unsigned long nam;
    7.     int ngay, thang;
    8.     printf("Nhap vao ngay ");
    9.     scanf("%d",&ngay);
    10.     printf("Nhap vao Thang ");
    11.     scanf("%d",&thang);
    12.     printf("Nhap vao Nam ");
    13.     scanf("%lu",&nam);
    14.     switch(thang)
    15.     {
    16.         case 1:
    17.         case 3:
    18.         case 5:
    19.         case 7:
    20.         case 8:
    21.         case 10:
    22.         case 12:
    23.                         if((ngay>0)&&(ngay<32)&&(nam>0))
    24.                 printf(" Ngay nay la ngay hop le");
    25.             else
    26.                 printf(" Ngay nay la ngay khong hop le");
    27.             break;
    28.         case 2:    
    29.             if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
    30.             {
    31.                 if((ngay>0)&&(ngay<30))
    32.                     printf(" Ngay nay la ngay hop le")
    33.                 else
    34.                     printf(" Ngay nay la ngay khong hop le");
    35.             }
    36.             else
    37.             {
    38.                 if((ngay>0)&&(ngay<29))
    39.                     printf(" Ngay nay la ngay hop le");
    40.                 else
    41.                     printf(" Ngay nay la ngay khong hop le");
    42.             }
    43.                 break;
    44.         case 4:
    45.         case 6:
    46.         case 9:
    47.         case 11:                if((ngay>0)&&(ngay<31)&&(nam>0))
    48.                         printf(" Ngay nay la ngay hop le");
    49.                     else
    50.                     printf(" Ngay nay la ngay khong hop le");
    51.                     break;
    52.         default :       printf("Ngay nay la ngay khong hop le ");
    53.  
    54. }
    55. getch();
    56.  }
    HẾT
    Đã được chỉnh sửa lần cuối bởi hailoc12 : 31-08-2006 lúc 02:05 PM.

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Xây dựng menu để vẽ các hình

    BÀI 05 :

    1. Ý TƯỞNG THUẬT TOÁN :
    Bài này khai báo một biến kí tự để so sánh với mã phím input
    Nếu nhập 1 thì nhập chiều dài & rộng của hình chữ nhật
    Cách in ra hình chữ nhật như sau :
    In ra một dòng * có chiều dài là độ dài của hình
    Sau đó xuống dòng in ra kí tự * và in một dòng khoảng trắng nhỏ hơn độ dài là 2 rồi in kí tự * và xuống hàng
    Cứ như thế lặp lại số lần = chiều rộng trừ 2
    In một dòng * cuối cùng bằng độ dài của hình
    Nếu nhập vào 2 thì nhập cạnh của hình vuông
    Cách in hình vuông tương tự như hình chữ nhật

    2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
    Trong bài này cĩ bi?n menu là bi?n nh?n mã phím và di?u khi?n vẽ hình
    Các biến a,b : là độ dài của hình cần vẽ

    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. void main()
    4. {
    5.     clrscr();
    6.     char menu;
    7.     int a,b;
    8.     do
    9.     {
    10.         printf(" Bam phim 1 de ve hinh chu nhat \n");
    11.         printf(" Bam phim 2 de ve hinh Vuong \n");
    12.         printf(" Bam phim 3 de thoat chuong trinh \n");
    13.         printf(" Nhap vao mot so de thuc hien  \n");
    14.         fflush(stdin);
    15.         scanf("%c",&menu);
    16.        /*-----------Ve Hinh Chu Nhat --------------------*/
    17.         if(menu=='1')
    18.         {
    19.             printf("Nhap vao chieu dai cua hinh ");
    20.             scanf("%d",&a);
    21.             printf("Nhap vao chieu rong cua hinh ");
    22.             scanf("%d",&b);
    23.             for(int i=0;i<a;i++)
    24.                 printf("*");
    25.                 printf("\n");
    26.             for(int j=0;j<b-2;j++)
    27.             {
    28.                 printf("*");
    29.                 for(int k=0;k<a-2;k++)
    30.                     printf(" ");
    31.                 printf("*\n");
    32.             }
    33.             if(a>1)//In ra dong cuoi,truong hop a=1 neu In se du mot dong
    34.             {
    35.                 for(int i=0;i<a;i++)
    36.                     printf("*");
    37.             }
    38.             printf("\n");
    39.         }
    40.        /*--------Ve Hinh Vuong --------------------------*/
    41.         if(menu=='2')
    42.         {
    43.             printf("Nhap vao canh cua hinh ");
    44.             scanf("%d",&a);
    45.             for(int i=0;i<a;i++)
    46.                 printf("*");
    47.                 printf("\n");
    48.             for(int j=0;j<a-2;j++)
    49.             {
    50.                 printf("*");
    51.                 for(int k=0;k<a-2;k++)
    52.                     printf(" ");
    53.                 printf("*\n");
    54.             }
    55.             if(a>1)//In ra dong cuoi,truong hop a=1 neu In se du mot dong
    56.             {
    57.                 for(int i=0;i<a;i++)
    58.                     printf("*");
    59.             }
    60.             printf("\n");
    61.  
    62.         }
    63.     }while(menu!='3');
    64.     if(menu=='3')
    65.         return;
    66.     getch();
    67. }
    HẾT

  6. #6
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Bài tập cơ bản 6:

    BÀI 06

    1. Ý TƯỞNG THUẬT TOÁN :
    Đặt một biến bằng số nguyên nhỏ nhất sau đó tăng lên 1
    Giảm số cần phân tích bằng cách chia cho biến đó
    Thực hiện cho đến khi nào phép chia ở bước b =1

    2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
    Trong bài ta đặt biến i là biến số nguyên tố nhỏ nhất i =2, n là biến input cần phân tích

    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. void main()
    4. {
    5.     clrscr();
    6.     unsigned long n,i=2;
    7.     printf("Nhap vao so can phan tich ");
    8.     scanf("%lu",&n);
    9.     while(i<=n)
    10.     {
    11.         if(n%i==0)
    12.         {
    13.             if(n/i==1)
    14.                 printf("%2lu",i);
    15.             else
    16.                 printf("%2lu x",i);
    17.             n/=i;
    18.  
    19.         }
    20.         else
    21.             i++;
    22.     }
    23.     getch();
    24. }
    HẾT

  7. #7
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Xác định số chính phương

    BÀI 07

    1. Ý TƯỞNG THUẬT TOÁN :
    Định nghĩa: số chính phương là số có căn bậc 2 là một số nguyên
    Đối với bài này ta có hai cách viết
    Cách 1 : Ta lấy căn bậc hai của số đó trừ cho phần nguyên căn bậc 2 của số đó nếu bằng 0 thì nó là số chính phương, ngược lại không phải.
    Cách 2 : Cho vòng for i chạy từ 1 đến số cần kiểm tra nếu i*i==n thì xuất ra nó là số chính phương và thoát chương trình

    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    o n : là biến input
    o flag :là biến cờ để biết đúng hay sai nếu bằng 1 là số chính phương

    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<math.h>
    4. void main()
    5. {
    6.     clrscr();
    7.     float n;
    8.     int flag=0;
    9.     printf("Nhap vao mot so ");
    10.     scanf("%f",&n);
    11.     /*-------------------Cach 1 ------------------------------*/
    12.     for(float i=1;i<=n;i++)
    13.     {
    14.         if(n==i*i)
    15.         {
    16.             printf("La so chinh phuong");
    17.             flag=1;
    18.             break;
    19.         }
    20.     }
    21.     if(flag==0)
    22.         printf("Khong phai la so chinh phuong");
    23.  
    24.    
    25.  
    26.  
    27. /*------------------Cach 2 -------------------------------*/
    28.     /*
    29.         if(sqrt(n)==(int)sqrt(n))
    30.             printf("La so chinh phuong ");
    31.         else
    32.             printf("Khong phai");   */
    33.     getch();
    34. }
    HẾT

  8. #8
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Xác định số nguyên tố trong lập trình C

    BÀI 08

    1. Ý TƯỞNG THUẬT TOÁN :
    Định nghĩa: Số nguyên tố là số chỉ chia hết cho 1 và chính nó, điều kiện là lớn hơn 1
    Đối với bài này có rất nhiều cách làm nhưng tôi nghĩ cách sau là các bạn dễ hiểu nhất
    Cho một vòng lặp for i chạy từ 2 cho đến số cần kiểm tra nếu số đó chia hết cho i thì đếm số lần
    Kết luận nếu số lần chia hết là 1 thì là số nguyên tố ngược lại thì không phải
    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    n : là biến input
    i : lưu động từ 2 đến n
    dem : đếm số lần n chia hết cho i

    3. BÀI GIẢI :
    C Code:
    1. #include<stdio.h>
    2. #include<conio.h>
    3. void main()
    4. {
    5.     clrscr();
    6.     unsigned long n;
    7.     int dem=0;
    8.     printf(" Ban hay nhap vao so ");
    9.     scanf("%lu",&n);
    10.     for(unsigned long i=2;i<=n;i++)
    11.     {
    12.         if(n%i==0)
    13.             dem++;
    14.     }
    15.     if(dem==1)
    16.         printf(" La so nguyen to");
    17.     else
    18.         printf(" khong la so nguyen to");
    19.     getch();
    20.  
    21. }
    HẾT

    Thuật toán của bài này cũng được !!
    Nhưng mà có cách khác cũng được đó :Bạn cho thêm 1 biến phụ chẳng hạn biến NT=1.
    VD chương trình sau:
    C Code:
    1. #include "stdio.h"  
    2. #include "conio.h"
    3. void main()
    4. {
    5.        int N,i,NT=1;
    6.        printf("\nNhap gia tri cua N:");
    7.        scanf("%d",&N);
    8.        for(i=2;i<N;i++)
    9.        if(N%i==0)
    10.        {
    11.                NT=0;
    12.                break;
    13.        }
    14.        if(NT)
    15.                printf("\nSo %d la so nguyen to.",N);
    16.        else
    17.                printf("\nSo %d ko la so nguyen to.",N);
    18.        getch();
    19. }

    Mình nghĩ cách làm này vẫn chưa hay vì thực tế ta chỉ cần kiểm tra từ 2 đến căn bậc 2 của n là ok rồi. Giả mã:
    C Code:
    1. bool bNguyenTo;
    2. if (n == 2) bNguyenTo = true;
    3. else
    4. {
    5. [INDENT]
    6. bNguyenTo = true;
    7. for (int i = 2; i <= sqrt(n); i++)
    8. [INDENT]if ((n % i) == 0)
    9. {
    10. [INDENT]bNguyenTo = false;
    11. break;[/INDENT]
    12. }[/INDENT][/INDENT]
    13. }
    14. if (bNguyenTo == true) printf("n là số nguyên tố");
    15. else printf("n là hợp số");

    Đã sửa lại
    C Code:
    1. #include "stdio.h"
    2. #include "conio.h"
    3. #include "math.h"
    4. int main()
    5. {
    6.    int n;
    7.    printf("\nHay nhap vao so can kiem tra: ");scanf("%d",&n);
    8.    int bNguyenTo;
    9.    if (n == 2) bNguyenTo = 1;
    10.    else
    11.     {
    12.        bNguyenTo = 1;
    13.        for (int i = 2; i <= sqrt(n); i++)
    14.       if ((n % i) == 0)
    15.         {
    16.            bNguyenTo = 0;
    17.            break;
    18.         }
    19.     }
    20.     if (bNguyenTo) printf("n la so nguyen to");
    21.     else printf("n la hop so");
    22. return 0;
    23. }
    Đại loại là vậy, mình cũng chưa kiểm tra lại

    Rất cám ơn sự góp ý của hai anh, đúng là đoạn chương trình của hai anh tối ưu hơn thật. Em đã sửa lại cho nó chạy được, tuy nhiên hình như vẫn còn một lỗi nào đó, với 1 nó vẫn cho là số nguyên tố.
    Em cũng chưa hiểu rõ lắm tại sao chỉ cần chạy tới căn bậc hai của N vì rõ ràng theo định nghĩa thì nó phải không chia hết cho mọi số nhỏ hơn nó trừ số 1

    1. 0 và 1 thì người ta không xét là nguyên tố hay hợp số cả, vì vậy trong đoạn code hoàn chỉnh em nên thêm nó vào.
    2. Định nghĩa là một chuyện còn định lý, hệ quả lại là một chuyện khác, sau đây sẽ là chứng minh một số tự nhiên n là hợp số thì sẽ tồn tại một ước số không lớn hơn căn bậc 2 của n:
    Thuật giải Code:
    1. Vì n là hợp số => tồn tại một số p(p#1, p#n) để n chia hết cho p.
    2. Đặt q= n/p => q#1, q#n.
    3. đặt r= min(p, q) => r<=p && r<=q
    4. => r^2 <= p*q = n
    5. => r <= sqrt(n) mà r là ước của n (do r =p hoặc r =q)
    6. => n tồn tại một ước số nhỏ hơn hoặc bằng căn bậc 2 của n và khác 1
    7. => đpcm
    8. P/S: kí hiệu "#" nghĩa là khác ^_^

    Cám ơn anh nhiều, ra là vậy, em tìm mấy sách chỉ thấy nó bảo cải tiến như vậy thôi chứ chẳng sách nào nói vì sao cả.

    Trích dẫn Nguyên bản được gửi bởi hailoc12
    Cám ơn anh nhiều, ra là vậy, em tìm mấy sách chỉ thấy nó bảo cải tiến như vậy thôi chứ chẳng sách nào nói vì sao cả.
    Lão Vinhie là bạn Em đó các Bác.
    --------------------------------------------------------------------------
    Cho Em hỏi cái!
    Trong C/C++ có Function nào có thể check 1 chuỗi xem nó có là số hay không?
    Ví dụ:
    1-String s = "Hello World";or
    2-String s = "1.2354"
    If NO(TH 1) return FALSE.
    If YES(TH2) return TRUE.
    Thanks a lot.

    1. sao chú ecard biết mà vào đây nhỉ?
    2. Không có nguyên một hàm như thế nhưng cũng có cách đấy, ngắn thôi!

    2. Không có nguyên một hàm như thế nhưng cũng có cách đấy, ngắn thôi!
    Khó quá hả ??? Đang nghĩ chứ giề ???
    Could U help me at All???Y!
    PS/
    Nghe nói đây là chuyên nghanh` của Lão Vinhie47.

    hehe, chú em chỉ hỏi Yes/No chứ không hỏi How thì anh trả lời như vậy là thoả đáng rồi, trong trường hợp này thì làm như sau:
    PHP Code:
    if (atof(str) == 0)
         
    printf("không phải là số");
    else
         
    printf("là số"); 
    đại loại là vậy.
    P/S: chú bảo cái gì là chuyên ngành anh cơ? :-/

    Bác đã reply qua YIM rồi,Ai ngờ qua đấy vẫn thấy bài.Bác chu đáo quá ha.
    He sao bây giờ có hàm atof hay ha.
    Tuy Tui còn một số thắc mắc về vấn đề này nhưng đã được ngộ ra một ít (not All vì Em hơi đần)
    Cuối cùng cũng để giải quyết bài toán trên nhưng được thực hiện bởi một ngôn ngữ khác.Một thứ ngôn ngữ không nằm trong chính giáo.
    Code:
    str$='abcd' 
    **str$='1.2345' 
    **str$='7654' 
    var1=VAL(str$) 
    If (var1=0) Then 
      Message("variable is string.","") 
      Return() 
    Else 
      var2=INT(var1) 
      If (var1<>var2) Then 
        Message("Variable is Floating Point number.","") 
      Else 
        Message("Variable is Integer number.","") 
      End 
    End
    Đố Vinhie46.9999 biết đó là thứ ngôn ngữ gì .If Bác biết Em cho Bác 10K.
    Thanks for your help
    Regards.

    Ku câu bài quá! Cái đoạn trên chẳng biết là cái gì nhưng chắc chỉ có họ hàng nhà BASIC mới có mấy cái từ khóa linh tinh như trên.
    Lại còn thêm cái dollar vào cuối tên biến kiểu string nữa chứ, có khi là QBASIC hay color Basic,... gì gì đó. Thử search thì lại không thấy cái gì vừa có $ ở cuối, vừa có Message("stupid something") cả. Để lúc nào rảnh rỗi anh tìm được rồi PM cho chú vậy :(

    P/S: mà chú bỏ cái kiểu nửa Việt nửa Anh đấy đi, đọc bực mình quá!

    Đúng rồi, cái này là họ hàng nhà Basic, nếu không thì cũng là con cùng cha khác mẹ hoặc cùng mẹ khác cha thôi. Dùng google đi.

    Có cái gì mang lên đây cho anh em xem với chứ, nói xuông làm tính tò mò của Dreaminess nổi lên rồi nè. he he

    Hê hê, vừa rồi mới nghĩ ra là thằng bạn của mình vốn sẵn tính lười, nên chắc nó lấy được đoạn code này ở đâu đó rồi cut-n-paste nên tìm thử luôn cái code trên, không ngờ ra luôn kết quả thật )
    Cái ngôn ngữ trên không phải là Programming language mà là một dạng Scripting language (cái này không phải là anh vừa t.A+V như chú đâu mà là dịch ra thì khó hiểu hơn). Tên nó là MMB (Multimedia Builder)
    Chi tiết tại đây:
    _http://mmb.mediachance.com/

    Thằng Em của Tại Hạ đang học C nó hỏi một câu như thế mà trình độ C của Tôi thì lại còi cọc quá. Nên câu hỏi tuy đơn giản nhưng Tôi không trả lời được.Nên lên mạng hỏi , Ai ngờ vào đây thấy chú Vinh làm Mod, giật cả Mình nên mới tham gia chút cho vui thôi, chứ không dám múa máy linh tinh đâu. Không ngờ thằng Google lại nguy hiểm như vậy.Tại hạ cũng không ngờ mình sơ hở đến thế, để cho Lão Vinhie(Vinh Intenet Explorer) nó search, nếu biến tướng đi một chút thì có lẽ không có chuyện này xảy ra.Thật khâm phục , khâm phục tài search của Chú Vinh.
    Ku câu bài quá!
    Mod kinh quá , Xóa luôn hết các Bài của Anh đi .Anh không đánh giá cao chuyện này %

    Hê hê, vừa rồi mới nghĩ ra là thằng bạn của mình vốn sẵn tính lười, nên chắc nó lấy được đoạn code này ở đâu đó rồi cut-n-paste nên tìm thử luôn cái code trên, không ngờ ra luôn kết quả thật )
    Thực ra đây là câu hỏi của Tui được lão Odklizec trả lời chứ không phải Tui lấy code linh tinh rồi copy paste vào đây.
    Câu hỏi của Tôi đến đây là kết thúc.

    Good luck.
    Đã được chỉnh sửa lần cuối bởi hailoc12 : 14-06-2007 lúc 01:44 PM. Lý do: Tạm thời làm liền để quy củ hơn

  9. #9
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Mặc định Xác định USCNN và BSCLN

    BÀI 09

    1. Ý TƯỞNG THUẬT TOÁN :
    Ta chỉ xét khi a# 0 và b#0
    TH1 :Nếu Xét a> =b thì ta lấy a – cho b cho đến khi nào a nhỏ hơn b . Lưu ý : (Nếu a=0 thì thoát ) . Nếu 0 < a <b thì ta lại lấy b –cho a cho đến khi nào b =0
    TH2 : Ngược lại khi b >=a
    Cuối cùng
    - Nếu a=0 thì ước chung lớn nhất là b và bội chung nhỏ nhất là (x * y ) /b .
    - Nếu ngược lại thì ước chung lớn nhất là a và bội chung nhỏ nhất là ( x * y)/a
    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    - Trong bài chỉ có hai biến quan trọng đó là x,y là 2 biến input và a , b là hai biến gán tạm thời bằng giá trị x ,y để khi thực hiện sẽ không làm ảnh hưởng đến giá trị của hai số input ban đầu .

    3. BÀI GIẢI :

    C Code:
    1. //Bài giải 1
    2. #include<stdio.h>
    3. #include<conio.h>
    4. void main()
    5. {
    6.     clrscr();
    7.     /* -------------tim Uoc so chung lon nhat ----------*/
    8.     unsigned long a,b,x,y;
    9.     printf("Nhap vao so thu nhat ");
    10.     scanf("%lu",&a);
    11.     printf("Nhap vao so thu hai ");
    12.     scanf("%lu",&b);
    13.     x=a ; y=b;
    14.                 while((a!=0)&&(b!=0))
    15.     {
    16.         if(a>=b)
    17.             a-=b;
    18.         else
    19.             b-=a;
    20.     }
    21.     /* boi so chung nho nhat la tich cua hai so chia cho USCLN */
    22.  
    23.     if(a==0)
    24.     {
    25.         printf(" Uoc so chung lon nhat la %lu \n" ,b);
    26.         printf(" Boi so chung nho nhat la %lu ",(x*y)/b);
    27.     }
    28.     else
    29.     {
    30.         printf("Uoc so chung lon nhat la %lu \n",a);
    31.         printf(" Boi so chung nho nhat la %lu ",(x*y)/a);
    32.     }
    33.     getch();
    34.  
    35. }

    C Code:
    1. //Bài giải 2: Sử dụng thuật toán ƠCLIT
    2. #include<stdio.h>
    3. #include<conio.h>
    4. void main()
    5. {
    6.     clrscr();
    7.     /* -------------tim Uoc so chung lon nhat ----------*/
    8.     unsigned long a,b,t,r,x,y,ucln;
    9.     printf("Nhap vao so thu nhat ");
    10.     scanf("%lu",&a);
    11.     printf("Nhap vao so thu hai ");
    12.     scanf("%lu",&b);
    13.     if (a<b)
    14.                 {
    15.                   t= a;
    16.                   a= b;
    17.                   b=t;
    18.                 }
    19.              x=a;
    20.              y=b;
    21.              r=b;
    22.              while (r>0)
    23.              {
    24.                r=a % b;
    25.                if (r==0) ucln=b;
    26.                else
    27.                    {
    28.                       a=b;
    29.                       b=r;
    30.                     }
    31.              }
    32.                 /* boi so chung nho nhat la tich cua hai so chia cho USCLN */
    33.              printf("\nUoc chung lon nhat la %d",ucln);
    34.              printf("\nBoi chung nho nhat la %d",(x*y / ucln));
    35.     getch();
    36.  
    37. }


    HẾT

    Bài này làm theo cách này vừa dài vừa ko hay ....!!
    Bà con xem có còn chỗ nào có thể rút ngắn đi được ko..!!Suy nghĩ đi...Dài quá

    Có gì đâu. Thay vì dùng a-b ta thay bằng a mod b. Chương trình vừa chạy nhanh và ngắn. He he.

    Vâng, em sẽ sửa lại
    Còn về thuật toán ƠClIT nếu bạn nào chưa biết mình sẽ trình bày lại

    Bài giải 1 tìm USCLN em thấy nó sao sao ấy ! Hình như số nào nó cũng cho ra số 0 thì phải.
    Em nhớ cách làm là :
    for (;a!=b// mới chỉ học vòng lặp for
    if (a>b) a-=b;
    else b-=a;
    uscln=a;//hoặc uscln=b

    Bài giải 1 mình đã xem lại rồi, nó vẫn chạy ngon lành cho đáp án đúng. Bạn thử xem có trục trặc gì ở trình biên dịch không .
    C Code:
    1.     x=a ; y=b;
    2.     while((a!=0)&&(b!=0))
    3.     {
    4.         if(a>=b)
    5.             a-=b;
    6.         else
    7.             b-=a;
    8.     }
    Phần trên chính là đoạn để tìm ước chung lớn nhất, sau khi chạy số nào bằng 0 thì đó chính là UCLN.

    Trích dẫn Nguyên bản được gửi bởi batdangky
    Bài giải 1 tìm USCLN em thấy nó sao sao ấy ! Hình như số nào nó cũng cho ra số 0 thì phải.
    Em nhớ cách làm là :
    for (;a!=b// mới chỉ học vòng lặp for
    if (a>b) a-=b;
    else b-=a;
    uscln=a;//hoặc uscln=b
    Nếu sử dụng Borland C++ for Win(BCW.exe) thì khải khai báo đúng thư mục hệ thống(Windows) khi cài đặt. Nếu không mọi kết quả tính toán sẽ là zero hết.

    Thuật toán Euclid dựa trên một tính chất số học là
    UCLN(a,b) = UCLN(b, a mod b) với a,b là các số nguyên

    Vì thế ta có thuật toán

    while (b > 0)
    {
    r = a % b;
    a = b;
    b = r;
    }
    return a;

    Thực ra thì thuật toán sử dụng phép trừ bản chất cũng giống như trên vì :

    a mod b = a - m*b
    Nhưng thực tế thuật toán này chạy nhanh hơn.

    Phép trừ chạy nhanh hơn ư ? Cái này lần đâu tiên em được nghe thấy. Anh có thể giải thích rõ hơn được không ?

    Trích dẫn Nguyên bản được gửi bởi hailoc12
    Phép trừ chạy nhanh hơn ư ? Cái này lần đâu tiên em được nghe thấy. Anh có thể giải thích rõ hơn được không ?
    Không phải tôi nói phép trừ chạy nhanh hơn mà là thuật toán Euclid dùng phép mod nhanh hơn thuật toán Euclid dùng phép trừ.

    Phép toán mod chậm hơn phép trừ rất nhiều nhưng tốc độ hội tụ đến UCLN lại nhanh hơn.Mọi người cứ viết chương trình thử nghiệm thì thấy.

    Ở đây có sự nhầm lẫn. Phép lấy dư (Mod) bao giờ chạy nhanh hơn phép trừ. Vì máy tính thực hiện phép lấy dư chỉ bằng một lần tính, còn phép trừ thì nhiều hơn, vì phép trừ còn phải lấy bù hai sau đó mới tính và phải tính qua phép toán cộng.

    Cũng chưa hẳn, làm phép trừ có một mạch riêng đâu cần phải lấy bù hai. Chưa biết chừng để tạo được phép mod máy nó phải làm cả phép chia, nếu vậy thì rõ ràng là trừ như vậy nhanh hơn.

    Làm gì có mạch trừ. Không biết các CPU mới thế nào chứ loại x86 mà chúng ta đang dùng không có mạch trừ chứ. Dreaminess chưa hề nghe đến mạch trừ trong CPU x86 hoặc CPU cùng thời hoặc cũ hơn.

    Em nhớ là có một địa chỉ hình như là 0000:406C có thể được dùng để đo tốc độ của chương trình. Trong pascal em vẫn thường đọc nó vào lúc bắt đầu chương trình và sau khi chương trình thực hiện xong để tính thời gian chạy, việc đó đựơc thực hiện thông qua chỉ thị absolute gán địa chỉ trực tiếp cho một biến. Nhưng không biết trong C có cấu trúc tương tự như vậy không. Em sẽ viết thử chương trình đo tốc độ để xem cái nào chạy nhanh hơn
    Đã được chỉnh sửa lần cuối bởi hailoc12 : 14-06-2007 lúc 01:54 PM. Lý do: Tạm thời làm liền để quy củ hơn

  10. #10
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Mặc định Bài tập cơ bản 10

    BÀI 10 :

    1. Ý TƯỞNG THUẬT TOÁN :
    • Trong bài này thì chủ yếu là ta biết khống chế và in ra lượng dấu * cho phù hợp với định dạng của hình mà cần in .
    • Thường là ta cho một vòng lặp khống chế số hàng dấu * in ra , một vòng lặp in ra số khoảng trắng và một vòng lặp in ra dấu * . Nhưng cũng nên lưu ý hai vòng lặp này phải đồng thời lẫn nhau theo từng định dạng hình cần in .
    2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
    Trong bài chỉ có biến h là biến chiều cao input từ người dùng , các biến còn lại đều là biến chạy của các vòng lặp .
    3. BÀI GIẢI :
    C Code:
    1. // chuong trinh in tam giac ra man hinh //
    2. #include<stdio.h>
    3. #include<conio.h>
    4. void main()
    5. {
    6.     clrscr();
    7.     int h,i,j,k,t;
    8.     printf("Nhap Vao Chieu Cao Cua Hinh Tam Giac h= ");
    9.     scanf("%d",&h);
    10.     printf("\n");
    11. //-------------In Tam Giac Thu 1 & Thu 2---------------------//
    12.     for(t=0;t<2;t++)// in ra hai lan tam giac nhu nhau
    13.     {
    14.         for(i=1;i<=h;i++) // chay chieu cao cua hinh
    15.         {
    16.                for(j=1;j<=i;j++) // in ra so luong dau * tuong ung voi do dai
    17.             printf("*");
    18.         printf("\n");
    19.         }
    20.         printf("\n\n");
    21.         getch();
    22.     }
    23.  
    24. //------------In Tam Giac Thu 3-------------------------------//
    25.  
    26.     printf("\n");
    27.     for(i=h;i>0;i--)// chay chieu cao cua hinh
    28.     {
    29.         for(j=0;j<i-1;j++) //in khoang trang
    30.             printf(" ");
    31.         for(k=j;k<h;k++) // roi moi in dau * xuong  dong
    32.             printf("*"); //quay len in khoang trang tiep
    33.     printf("\n"); //khi i tang so luong khoang trang giam so luong * tang
    34.     }
    35.  
    36. //-----------In Tam Giac Thu 4-------------------------------//
    37.     printf("\n");
    38.     getch();
    39.     for(i=0;i<h;i++) // chay chieu cao cua hinh
    40.     {  
    41.  for(j=0;j<h-i;j++)//in ra dau * giam dan theo i
    42.             printf("*");
    43.         printf("\n");
    44.     }
    45.  
    46.  
    47. //---------- In tam giac thu 5--------------------------------//
    48.     printf("\n");
    49.     getch();
    50.     for(i=0;i<h;i++)//chay chieu cao
    51.     {
    52.         for(j=0;j<h-i;j++)// in ra so luong khoang trang giam theo i
    53.             printf(" ");
    54.         for(k=0;k<2*i+1;k++)// in ra so luong dau * tang theo 2*i +1
    55.             printf("*");
    56.         printf("\n");//xuong hang quay len tang i va lam tiep
    57.     }
    58. //-----------In tam giac thu 6------------------------------//
    59.     printf("\n");
    60.     getch();
    61.    
    62.  
    63. for(i=0;i<h;i++)// chay chieu cao cua hinh
    64.     {
    65.         for(k=0;k<=i;k++)// in ra so luong khoang trang tang theo i
    66.             printf(" "); // k+ them 1 truoc khi xuong dong for ke tiep
    67.         for(j=k;j<=(2*h)-k;j++)// vi vay in ra so luong dau *luon le
    68.             printf("*");
    69.             printf("\n");  //xuong hang quay len tang i thuc hien tiep
    70.     }
    71.  
    72. getch();
    73. }
    HẾT

Các đề tài tương tự

  1. Các thuật toán sắp xếp trong lập trình C | Cấu trúc dữ liệu và giải thuật
    Gửi bởi iamvtn trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 11-02-2017, 04:44 PM
  2. Giải thuật shaker sort. Giúp mình giải thuật với?
    Gửi bởi nguyenhai trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 29-01-2015, 10:53 PM
  3. Bài tập C Cần giải giúp 3 câu trong đề thi kĩ thuật lập trình C và Cấu trúc dữ liệu và giải thuật
    Gửi bởi nguyenthi0602 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 24-09-2012, 08:42 PM
  4. Xin Tài liệu về thuật toán chủ nhà băng, giải thuật Deadlock, quản lý bộ nhớ?
    Gửi bởi huutrieu2005 trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 2
    Bài viết cuối: 28-12-2010, 10:10 AM
  5. lưu đồ giải thuật bài mã đi tuần thuật toán quay lui vét cạn. Giúp mình với?
    Gửi bởi katemat000 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 05-01-2010, 10:53 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn