01/10/2018, 08:22

Tìm số nguyên tố trong c

Bài này thì nên làm thế nào vậy ạ

Người bí ẩn viết 10:25 ngày 01/10/2018

Bước 1: Viết 1 hàm kiểm tra số nguyên tố riêng.
Bước 2: Xử lý các vấn đề sau trong hàm main():

  • Nhập vào 2 số tự nhiên m và n (0 <= m < n)
  • Dùng vòng lặp chạy từ m đến n, mỗi lần lặp kiểm tra xem số đó có phải số nguyên tố hay không ? Nếu phải thì in ra màn hình và tăng biến đếm (đã khai báo từ trước), nếu không phải bỏ qua
  • Sau khi chạy hết vòng lặp thì in biến đếm ra màn hình.
  • X viết 10:26 ngày 01/10/2018

    Ở đây anh cũng có vài clip liên quan, em xem cho biết
    Open playlist!

    vu van thinh viết 10:34 ngày 01/10/2018

    Cảm ơn mọi người ạ nhưng
    Bài tập này e k đc dùng hàm ạ code của e như vậy mà lỗi thế thì phải làm sao ạ

    rogp10 viết 10:32 ngày 01/10/2018

    Chạy sàng từ m đến n.

    vu van thinh viết 10:28 ngày 01/10/2018

    Như vậy là mình phải làm sao ạ

    Bùi Thế Khải viết 10:24 ngày 01/10/2018

    thuật toán xác đinh nt :

    boolean chenk_nt(x) 
          check_nt := false;
          kt := 1;
          for i:=2 to  x do
              if (x mod i = 0) then kt++;
          if (kt = 2) then check_nt := true;
    

    còn trong hàm chính :

     -> m;
     -> n;
     if m < n  : 
        for i:=m to n do
            if (check_nt(i) = true) then -> i,' la nguyen to';
                                         dem ++;   
    

    xong

    rogp10 viết 10:33 ngày 01/10/2018

    ^ sqrt(x) chớ

    Này nhé: Nếu n không nguyên tố thì sẽ có p là số nguyên sao cho p | n. Vậy thì (n/p) | n vì (n/p) * p = n. Nếu p và n/p đều lớn hơn sqrt(n) (giả thiết) thì nhân lại sẽ ra một số lớn hơn n, vô lí. Vậy chạy tới sqrt là đủ.

    ELI15: Với p nguyên dương (ít nhất) một trong hai số p và n/p không vượt quá sqrt(n). Có p thì cũng có luôn cả n/p, nên chia xuống kiểu gì thì chạy tới sqrt là hết.

    Người bí ẩn viết 10:29 ngày 01/10/2018
    boolean chenk_nt(x) 
          check_nt := false;
          kt := 1;
          for i:=2 to  x do
              if (x mod i = 0) then kt++;
          if (kt = 2) then check_nt := true;
    

    Hình như thuật toán của bạn chưa tối ưu cho lắm:

    bool CheckPrimeNumber(int number)
    {
         if (number < 2)
              return false;
         else if (number == 2)
              return true;
         else if (number & 0)
              return false;
         else {
              for (int i = 3; i <= sqrt(number); i += 2)
                   if (number % i == 0)
                        return false;
              return true;
         }
    }
    
    vu van thinh viết 10:33 ngày 01/10/2018

    code của e nó như vậy thì sao lại k liệt kê ra được các số nguyên tố trong khoảng m, n vậy ạ nó chạy ra tùm lum ạ mn chỉ giúp e đc k

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	int m, n, i, a;
    	printf("Nhap m:\n m=", m);
    	scanf("%d", &m);
    	printf("Nhap n:\n n=", n);
    	scanf("%d", &n);
    	if(m<n)
    	{
    		for ( i =m; i<=n; i++)
    		{
    			for ( a = 2; a<=(sqrt(i)); a++)
    			{
    				if (i % a != 0)
    				{
    					printf("Day la so nguyen to %d \n", i);
    				}
    				else
    				{
    					printf("Day khong phai so nguyen to %d \n", i);
    				}
    
    			}
    		}
    	}
    	else{
    		printf("Khong ton tai");
    	}	
    
    
    	return 0;
    }
    Bùi Thế Khải viết 10:27 ngày 01/10/2018

    p | n

    ký hiệu j vậy anh, e chưa thấy bao giờ

    rogp10 viết 10:36 ngày 01/10/2018

    p chia hết n. Nếu viết n chia hết cho p thì phải dùng dấu ba chấm dọc nên sách toàn viết thế này.

    Đầy đủ hơn: Nếu n là hợp số thì giả sử ta tìm được 1 ước p < B. Vậy ước còn lại là n*(1/p) > n*1/B = n/B. Để không bị sót hay thừa thì n/B = B hay B = sqrt(n).

    Bài liên quan
    0