Tải bản đầy đủ (.pdf) (6 trang)

Liệt kê các số đối xứng pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (101.97 KB, 6 trang )

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();
}

×