Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Giải Đáp: Lỗi xác định số nguyên tố

  1. #1
    Ngày gia nhập
    04 2022
    Bài viết
    0

    Mặc định Giải Đáp: Lỗi xác định số nguyên tố

    giúp em sửa lỗi với các cao nhân > nhập 5 nhưng lại fasle

    #include <stdio.h>
    int main()
    {
    long n,i,k;
    printf("Sulf> N>");
    scanf("%i", &n);
    for (i=1;i<=n;i++)
    {
    if(n%i==0)
    {
    k++;
    }
    }
    if(k==2)
    {
    printf("Sulf> True>");
    }
    else
    {
    printf("sulf> False>");
    }
    return(0);
    }

  2. #2
    Ngày gia nhập
    08 2022
    Bài viết
    1

    #include <stdio.h>
    int main()
    {
    int n,i,k;
    printf("Sulf> N>");
    scanf("%d", &n);
    if(n == 1||n ==0){
    printf("false");
    }else if(n==2){
    printf("true");
    }else if(n>2){
    if(n%2==0){
    printf("false");
    }else if(n%2!=0){
    for(int i = 3;i<n;i+=2){
    if(n%i==0){
    k = k+1;
    }
    }
    if(k>=1){
    printf("false");
    }else{
    printf("true");
    }
    }
    }
    }
    code tham khảo đây nha bạn

  3. #3
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    1,006

    " Hình như " biến k chưa được khởi tạo.

  4. #4
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    656

    Cả 2 bài viết đầu đều bị lỗi như MHoang nói
    Code đầu còn lỗi nữa là khai báo n là long nhưng khi scanf lại là "%i", đúng ra phải là "%ld"

  5. #5
    Ngày gia nhập
    02 2016
    Bài viết
    337

    Chỉnh code #1 (khởi tạo biến k):
    for (i=1, k=0;i<=n;i++)

    Chỉnh code #2 (if-else quá luộm thuộm):
    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i<n; i+=2) if(n%i==0) k++;
    }

    Tuy nhiên xét về giải thuật, cả hai code #1, #2 đều dở bẹt.

    Giải thuật chính:
    1. chỉ cần xét i tới căn hai của n. Nếu i*i > n thì dừng được rồi.
    2. chỉ cần chia chẵn cho một i là không phải số nguyên tố, kết luận luôn, xét tiếp mần chi.

    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i*i <= n; i += 2) if (n%i==0) { k = 1; break; }
    }
    printf(k? "false" : "true");
    .

  6. #6
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    656

    Mặc định Giải Đáp: Lỗi xác định số nguyên tố

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Chỉnh code #1 (khởi tạo biến k):
    for (i=1, k=0;i<=n;i++)

    Chỉnh code #2 (if-else quá luộm thuộm):
    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i<n; i+=2) if(n%i==0) k++;
    }

    Tuy nhiên xét về giải thuật, cả hai code #1, #2 đều dở bẹt.

    Giải thuật chính:
    1. chỉ cần xét i tới căn hai của n. Nếu i*i > n thì dừng được rồi.
    2. chỉ cần chia chẵn cho một i là không phải số nguyên tố, kết luận luôn, xét tiếp mần chi.

    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i*i <= n; i += 2) if (n%i==0) { k = 1; break; }
    }
    printf(k? "false" : "true");
    .
    Cái case 0: case 1: case 2:
    sai rồi kìa

    - - - Nội dung đã được cập nhật ngày 09-09-2022 lúc 07:41 AM - - -

    2 là số n tố, 0, 1 không phải n tố

  7. #7
    Ngày gia nhập
    02 2016
    Bài viết
    337

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Cái case 0: case 1: case 2:
    sai rồi kìa

    2 là số n tố, 0, 1 không phải n tố
    Nói chuyện code còn viết tắt, đọc một hồi mới hiểu n là cái quái gì.

    Xem cho kỹ lại luật switch/case đi. Code hoàn toàn chuẩn.
    Sau case 0 thì tuột qua case 1, sau case 1 thì break ---> k = 0

  8. #8
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    656

    Trích dẫn Nguyên bản được gửi bởi NguNhuheo Xem bài viết
    Chỉnh code #1 (khởi tạo biến k):
    for (i=1, k=0;i<=n;i++)

    Chỉnh code #2 (if-else quá luộm thuộm):
    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i<n; i+=2) if(n%i==0) k++;
    }

    Tuy nhiên xét về giải thuật, cả hai code #1, #2 đều dở bẹt.

    Giải thuật chính:
    1. chỉ cần xét i tới căn hai của n. Nếu i*i > n thì dừng được rồi.
    2. chỉ cần chia chẵn cho một i là không phải số nguyên tố, kết luận luôn, xét tiếp mần chi.

    int k = 0;
    switch (n) {
    case 0: case 1: break;
    case 2: k = 1; break;
    default:
    for(int i = 3; i*i <= n; i += 2) if (n%i==0) { k = 1; break; }
    }
    printf(k? "false" : "true");
    .
    Trong code cuối của bạn, if n%i == 0 thì k =1, nghĩa là nếu k=1 thì n không phải là số nguyên tố, điều này nhất quán với cái printf bên dưới
    Thế nhưng case 0 case 1 thì k = 0, nghĩa là 0 và 1 là số nguyên tố???

    Ps: xin lỗi vì viết tắt làm bạn khó hiểu

  9. #9
    Ngày gia nhập
    02 2016
    Bài viết
    337

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Trong code cuối của bạn, if n%i == 0 thì k =1, nghĩa là nếu k=1 thì n không phải là số nguyên tố, điều này nhất quán với cái printf bên dưới
    Thế nhưng case 0 case 1 thì k = 0, nghĩa là 0 và 1 là số nguyên tố???
    Ờ nhỉ. Bạn đúng rồi.
    Chủ yếu mục đích k = 0 thì "không", mà k > 0 thì "có". Lúc viết code, bị vướng cái break trong vòng lặp không phải là break của switch. Xoay qua xoay lại một hồi nhầm hết.
    Mà chính ra code vòng lặp cũng sai. Nếu chỉ chia cho số lẻ thì phải loại số chẵn trước.

    int k = 1;
    switch (n) {
    case 0: case 1: k = 0; break;
    case 2: break;
    default:
    if (n & 1 == 0) k = 0; // số chẵn
    else for(int i = 3; i*i <= n; i += 2) if (n%i==0) { k = 0; break; }
    }
    printf(k? "true" : "false");
    .

    Dùng phép xét hội tụ hai đầu có thể hiệu quả hơn:

    Code:
    int k = 0;
    switch (n) {
      case 0: case 1: break;
      case 2: k = 1; break;
      default:
        if (n & 1 == 0) break; // chỉ xét số lẻ
        k = 1;
        for (int i =  3, j; i <= (j = n/i); i +=2)
          if (i * j == n) { k = 0; break; }
     }
    printf("%d %s số nguyên tố", n, (k? "là" : "không phải"));
    Đã được chỉnh sửa lần cuối bởi NguNhuheo : 21-09-2022 lúc 01:18 AM.

  10. #10
    Ngày gia nhập
    04 2009
    Bài viết
    118

    Bạn có thể làm 2 cách.
    1. kiểu top-dơn kiểu kiểm tra trên xuống
    2. Kiểu tạo 1 funtion kiểm tra.

    Code:
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    int main()
    {
     int SO_KT;
    cout<<"Nhap so can kiem tra: " ;
    cin >> SO_KT;
    
    if(SO_KT<2) 
    	cout <<SO_KT <<" Khong la so nguyen to";
    
    else if(SO_KT==2)
    	cout<<SO_KT <<" La so nguyen to" ;
    else
    {	
    int Dem=0;
    	for (int i = 3; i < (SO_KT - 1); i += 1){
    		if(SO_KT%i==0)
    		{
    			Dem=1;
    			break;
    		}
    	}
    	
    	if(Dem==0)
    		cout<<SO_KT <<" La so nguyen to";
    	else
    			cout<<SO_KT <<" Khong la so nguyen to";
    }
     
     return 1;
    }
    Các bạn có thể xem chi tiết bài viết
    http://laptrinhvacuocsong.com/

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