Lặp vô hạn bài toán kiểm tra 1 số là số nguyên tố

#include <stdio.h>
void so_nguyen_to(int n);
int main()
{
    printf("%s",so_nguyen_to(11));
    return 0;
}
void so_nguyen_to(int n)
{
    if (n==3||n==5||n=7)
        printf("so nay la so nguyen to");
    if (n<2)
        printf("so nay ko phai so nguyen to");
    if (n==2)
        printf("so nay la so nguyen to");
    if (n%2==0)
        printf("so nay ko phai so nguyen to");
    for (int i=3; i*i%n; i=i+2) {
        if (i%n) printf("so nay ko phai so nguyen to");
        else
            printf("so nay la so nguyen to");
    }
    return;
}

Giúp gì e? e viết rõ tiêu đề topic va nói rõ vấn đề của e chứ ???

1 Like

nó chạy lag cả màn hình in tùm lum :wink: đại ca xem nó sai ở đâu ạ!

Có phải bài của e là kiểm tra 1 số có phải số nguyên tố hay không, e tham khảo bài này. A sẽ sửa lại tiêu đề cho e lần này, lần sau e nên đặt câu hỏi cụ thể hơn

2 Likes

Xét về cú pháp của các câu lệnh thì code của bạn bị lỗi rồi.Cụ thể:

  1. Bạn khai báo là: void so_nguyen_to(int n);.
    tức là hàm này không trả về hàm gọi nó bất kì giá trị nào cả.Nhưng ở câu lệnh:printf("%s",so_nguyen_to(11));
    bạn lại lại bắt nó trả về 1 giá trị là không được.
    2.if (n==3||n==5||n=7).
    biểu thức n==3||n==5||n=7:lúc này bạn đang so sánh n với 3,5,7,kiểm tra xem giá trị của n có bằng một trong 3 giá trị trên không, nên bạn phải sửa lại như sau:n==3||n==5||n==7.
    Để kiểm tra 11 có phải là số nguyên tố hay không, mình xin được trình bày ý tưởng của mình như sau:
#include<stdio.h>
#include<math.h>
void so_nguyen_to(int n);
int main()
{
    so_nguyen_to(11);
    return 0;
}
void so_nguyen_to(int n)
{
    int check=1;
    for(int i=2; i<sqrt((double)n)&&check; i++)
        check=n%i;
    if(check)
        printf("%d la so nguyen to.",n);
    else
        printf("%d khong la so nguyen to.",n);
}
3 Likes

tks bác @14520054 cái ý tưởng trả về check là hay! tại trong link bài 35 mình để int! mà chạy hk ra lên ra đây post cho mọi ng giải đáp sớm! chứ a Đạt bận mai mới reply đc! mình thiếu sót trong phép so sánh =7 mà đúng là ==7!

2 Likes

Không liên quan tới câu hỏi nhưng cho anh góp ý một tí. Lần này @Honey_moon đạt câu hỏi hơi “tệ”, em đọc thêm 2 tác phẩm văn học hiện thực phê phán anh mới viết ở đây nhé

2 Likes

dạ e sẽ cố gắng!

3 Likes

i<sqrt((double)n) @ltd e nhớ kiến thức hồi cấp 3 của e! lấy căn bậc 2 của n không bằng mình bình phương i lên cũng được! cần j phải dài dòng như này ! e mới thử lúc nãy cho kết quả bt mà! chả hiểu sao lên google toàn thấy cái sqrt ko à. mà hàm này e chưa học tới! lên xem thì là căn bậc 2!

1 Like

Có lẽ ý của bạn là kiểm tra 1 số có phải là số nguyên tố hay không?
Mình có cái code này cho bạn, vẫn chưa nhanh lắm, nhưng cũng gấp 1/3 lần tính theo sqrt() thông thường;

   int so_NT(long n){
          long m,k;
          if(n<2) return 0;
          if(n==2||n==3 || n==5) return 1; 
          if(n%2==0 || n%3==0 || n%5==0) return 0;
          m=sqrt(n); 
          k=7;
          while(k<=m){
                   if(n%k==0) return 0;
                   if(n%(k+4)==0) return 0;
                   k=k+6;
          }
         return 1;
   }
1 Like

Nếu bạn có học môn Giải thuật nào đó có nói về độ phức tạp của thuật toán bạn sẽ thấy code càng ít câu lệnh, chạy vòng lặp ít, thực thi trong thời gian ngắn trong nhiều trường hợp là vô cùng tốt.

Bạn lập trình 1 cái máy tính bỏ túi casio có chức năng tìm số nguyên tố. Muốn tính theo bạn là i bình phương cũng chẳng sao cả. Nhưng bù lại thời gian chạy chương trình lâu hơn. Khi đó bạn phải đợi nó chạy i bình phương vòng lặp chưa kể điều kiện mới ra kết quả. Ví dụ mất khoảng 3s, trong khi người khác chỉ mất 1s.

1 Like

có phải là 1/3 căn n đúng ko?( tối ưu hoá so vs hiệu suất của bài sqrt là 3 lần thì vs e là 6 lần. 1 ng bạn của e cũng gửi cho e xem cái code này! Nhưng thú thực là e ko hiểu lúc đó! còn bjo thì e sau khi đã giải xong e mới hiểu! cái của a nâng cao rồi. A cứ chỉ e ba cái cách giải (nếu như e sai hướng),cũng như hàm e sai. Chứ giải cách e hiểu còn chưa xong tối ưu chắc e nhảy cầu quá :smiley: ! cảm ơn a

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?