30/09/2018, 18:07

mọi ng cho em xin cách giải bài C ++"Hãy liệt kê tất cả các số nguyên tố có N chữ số sao cho tổng các chữ số của số đó đúng bằng S cho trước. "này với ạ

Ngo Dinh Quyen viết 20:18 ngày 30/09/2018

Làm sao để tính được tổng các chữ số của 1 số?
–> Tách từng chữ số ra rồi cộng dồn lại
Vd: 123 -> 12 và 3 -> 1 và 2 và 3
–> Tổng = 1 + 2 + 3 = 6
Bạn vào đọc các quy định khi tạo topic trên daynhauhoc nhé. Trên đây ít người làm hộ bài cho bạn lắm, bạn phải tự làm, sai hay nhầm gì thì mọi người giúp thôi…

Duy Nguyen viết 20:09 ngày 30/09/2018

hì.thanks anh.em có viết phần xin cách lm cơ mà k hiểu sao nó k hiện lên

Ngo Dinh Quyen viết 20:10 ngày 30/09/2018

(/ ‘.’)/ *** Thế hả *** (’.’ )

Duy Nguyen viết 20:18 ngày 30/09/2018

nhưng anh ơi mình phải xét xém số n nhập vào có phải là SNT k rồi sau đó tính tổng các chữ số của nó rồi so sánh với tổng s mình nhập vào ban đầu ạ

Le Hoai viết 20:22 ngày 30/09/2018

Source code thì bạn phải tự viết nhé, không ai làm hộ cho đâu.
Thuật toán thì mình chia sẻ một cách mà mình nghĩ ra như thế này:
Đầu tiên là về số nguyên tố là số chỉ chia hết cho 1 và chính nó. xây dựng 1 method để kiểm tra xem 1 số có phải là số nguyên tố hay ko?

int isPrimeNumber(int x) {
   for(int i = 2; i < x; i++) {
        if(x % i == 0) { // neu chia het cho bat ky so nao ngoai 1 va chinh no, thi no khong phai la so nguyen to

            return 0;
        }
   }
  return 1;
}

Bây giờ việc tiếp theo là phải check xem 1 số có thỏa mãn điều kiện tổng các chữ số bằng S cho trước hay không. Cách làm là tách số x thành các chữ số bằng cách chia cho 10, lấy phần dư. Ta xây dựng hàm check

int isSum(int x) {

    int* i;
    int index = 0;
    while(x > 0) {

         i[index] = x % 10;
         x = (int) (x / 10);
        index++;
    }

   int sum = 0;
   for(int j = 0; j < index; j++) {
      sum += i[j];
   }

  if(sum == S) return 1;
  return 0;
}

Với 2 method trên, ta sẽ sử dụng để check các số có N chữ số thỏa mãn 2 đk trên. Với N chữ số, ta phải duyệt tất cả các số từ N*10 => (N+1)*10 - 1

Từ đó ta có vòng for :

for(int i = N*10; i  < (N+1) * 10; i++) {

    if( isPrimeNumber(i) == 1 && isSum(i) == 1) {

             printf("%d",i); // i la so thoa man dieu kien cua bai toan
   }
}

Cú pháp của C++ mình không nhớ rõ lắm nữa, nên bạn chỉnh lại cú pháp cho đúng nhé

Ngo Dinh Quyen viết 20:09 ngày 30/09/2018

Đúng rồi bạn, chỉ kiểm tra các số tự nhiên có N chữ số thôi( theo đề bài)…

Duy Nguyen viết 20:21 ngày 30/09/2018

ok.thanhs bạn nhiều

Gió viết 20:17 ngày 30/09/2018

Bài này chia ra làm 2 bài toán con:

  • Sinh tất cả các số tự nhiên có N chữ số có tổng = S
  • Kiểm tra tính nguyên tố
Anh viết 20:11 ngày 30/09/2018

Bạn ơi, với đk có n chữ số thì ta phải duyệt từ 10^(n-1) đến 10^n chứ bạn?

Gió viết 20:19 ngày 30/09/2018

Sinh tổ hợp lặp sẽ <= Cn-1n+s-1 số. Còn kiểm tra nguyên tố thì dùng rabin-miller dpt o(logn) cho mỗi số như vậy sẽ nhanh hơn

Le Hoai viết 20:19 ngày 30/09/2018

Thank bạn nhé. Mình chưa biết đến khái niệm này. Toán học hơi yếu

Gió viết 20:24 ngày 30/09/2018

Phần sinh số và giới hạn trên cũng chứng minh khá đơn giản
Giả sử tổng s=5 và có n=3

Ta sắp |*| <=> 212
||*** <=> 104

Trong đó sẽ có n-1 vách ngăn. Tổng ở giữa 2 vách sẽ là giá trị của chũ số với dk<=9 và số đầu sẽ >0
Cách xếp đó sẽ ~ công thức chọn tổ hợp n-1 vách của (s+n-1) nơi để

Thuật sinh cũng chỉ cần dùng quay lui là dc.

Bài liên quan
0