sử dụng giải thuật sinh sinh số thập phân thỏa mãn các điều kiện
Hãy
viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời những
điều kiện dưới đây:
(i)
K là số có 5 chữ số;
(ii)
K là số nguyên tố;
(iii)
K là số thuận nghịch (k là số thuận nghịch nếu đọc xuôi
hay đọc ngược các chữ số của k ta đều nhận được một số như nhau. Ví dụ số: 30303);
(iv)
Biểu diễn của K ở hệ cơ số B ( B bất kỳ được nhập từ
bàn phím cũng là một số thuận nghịch. Ví dụ số k=30303 có biểu diễn ở hệ cơ số
8 là 73137 cũng là một số thuận nghịch;
Bài giải:
#include<iostream> #include<cmath> #include<iomanip> using namespace std; void xuat( int a[], int n){ for(int i = 0; i < n; i++) cout << setw(1) << a[i]; cout << endl; } void sinh( int a[], int n, int &ok){ int i = n-1; while( i >= 0 && a[i] == 9){ a[i] = 0; i--; } if( i >= 0){ a[i] = a[i] + 1; } else ok = 0; } bool NguyenTo(int x) { if(x < 2) return false; for(int i = 2; i <= sqrt(x); i++) if(x % i == 0) return false; return true; } bool kttn(int n) { int m = n; int dao = 0 ; while(n > 0) { int t = n%10; dao = dao * 10 + t; n = n/10; } if(dao == m) return true; return false; } bool ktmang(int a[100], int n) { int i = 0; int j = n - 1; while( i < n/2) { if(a[i] != a[j]) return false; i++; j--; } return true; } bool chuyencoso(int x, int n) { int a[100]; int i = 0; while( n>0 ) { a[i] = n % x; n = n / x; i++; } if(ktmang(a,i)) return true; else return false; } int chuyenMangThanhSo(int a[100], int n){ int i = 0; int t = 0; while( i < n){ t = t + a[i] * pow(10,n-1-i); i++; } return t; } void next(int a[100], int n, int ok, int b){ while(ok){ int t = chuyenMangThanhSo(a, n); if(NguyenTo(t) && kttn(t) && chuyencoso(b,t)) cout << t << endl; sinh(a,n,ok); } } int main() { int n , b, ok = 1; int a[100] = {}; a[1] = 1; cin >> n; cin >> b; next(a,n,ok,b); }
Nhận xét
Đăng nhận xét