Liệt kê các số đối xứng Một số nguyên dương được gọi là đối xứng nếu chữ số thứ nhất bằng chữ số cuối, chữ số thứ hai bằng chữ số gần cuối… Cho 2 số nguyên dương m và n (m<n) và liệt kê các số đối xứng nằm giữa m và n. Chúng ta có thể lần lượt kiểm tra tính đối xứng của các số từ m đến n bằng cách đảo ngược số đang xét, một số là đối xứng nếu đảo lại vẫn bằng chính nó. #include<stdio.h> #include<conio.h> int daoso(int n); main() { int m,n,i; printf("TIM SO DOI XUNG\n"); printf(" moi ban nhap so m ");scanf("%d",&m); printf(" moi ban nhap so n > m ");scanf("%d",&n); if (n<=m) printf(" nhap n<=m mat roi "); else for (i=m;i<=n;i++) if (daoso(i)==i) printf(" %d ",i); getch(); } int daoso(int n) { int x,s=0; while (n!=0) { x=n%10; n/=10; s=s*10+x; } return s; } Thuật toán trên hết sức đơn giản, thực hiện tốt với n-m nhỏ. Nếu n rất lớn (hàng tỉ chẳng hạn) thì thuật toán trên tỏ ra không hiệu quả. Thay vào đó ta sẽ tạo ra các số đối xứng có từ Lm đến Ln chữ số (với Lm là số chữ số của m và Ln là số chữ số của n), rồi so sánh các số đối xứng đó với m và n. Thuật toán này cho phép liệt kê tất cả các số đối xứng từ 0 đến 999.999.999 trong giới hạn thời gian 1 giây. #include <iostream> #include <fstream> #include <string.h> using namespace std; int str2int(char s[]) { int ret=0; for (int i=0; s[i]; i++) ret=10*ret+s[i]-'0'; return ret; } int len(int n) { int r=0; do { r++; n /= 10; } while (n); return r; } void doixung(char s[], int &l, int k, int &m, int &n, ofstream &fo) { if (k>(l-1)/2) { int t=str2int(s); if (t>=m && t<=n) fo<<t<<endl; } else { int i; if (k==0 && l!=1) i='1'; else i='0'; for ( ;i<='9'; i++) { s[k]=s[l-k-1]=i; doixung(s,l,k+1,m,n,fo); } } } int main() { ofstream fo("sodoixung.out"); char s[10]; for (int i=0; i<11; i++) s[i]='0'; int m,n; cout<<"Nhap m: "; cin>>m; cout<<"Nhap n: "; cin>>n; int Lm=len(m), Ln=len(n); for (int L = Lm; L<=Ln; L++) { s[L]=0; doixung(s,L,0,m,n,fo); } fo.close(); } . ra các số đối xứng có từ Lm đến Ln chữ số (với Lm là số chữ số của m và Ln là số chữ số của n), rồi so sánh các số đối xứng đó với m và n. Thuật toán này cho phép liệt kê tất cả các số đối xứng. Liệt kê các số đối xứng Một số nguyên dương được gọi là đối xứng nếu chữ số thứ nhất bằng chữ số cuối, chữ số thứ hai bằng chữ số gần cuối… Cho 2 số nguyên dương m và n (m<n) và liệt kê. (m<n) và liệt kê các số đối xứng nằm giữa m và n. Chúng ta có thể lần lượt kiểm tra tính đối xứng của các số từ m đến n bằng cách đảo ngược số đang xét, một số là đối xứng nếu đảo lại vẫn