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 ạ
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…
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é
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 để
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…
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
(/ ‘.’)/ *** Thế hả *** (’.’ )
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 ạ
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?
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
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 :
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é
Đúng rồi bạn, chỉ kiểm tra các số tự nhiên có N chữ số thôi( theo đề bài)…
ok.thanhs bạn nhiều
Bài này chia ra làm 2 bài toán con:
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?
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
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
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.