"回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
具体可以看百科回文数介绍 百科回文数
计算机来求多少数之间的回文数,通常采用两种方法,一种是穷举,一种是根据回文数的规律直接求值。
穷举耗时,代码简单,求规律代码多,运行快。
c实例:
/*
**author:suju.
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
//返回num数字的宽度位数
int digits(long num)
{
int digits=0;
while (num!=0){
num=num/10;//除10得一位
digits++;
}
return digits;
}
//倒序数字
int transposition(int num)
{
int i,j=0;
while (num!=0){
i=num%10;
num=num/10;
j=j*10+i;
}
return j;
}
long printPalindromes(long num)
{
long temp=0;
long sum=9;//默认9 包括 1,2等
int i,j;
//小于等于10直接返回
if (num<10){
return num;
}
//取num位数折半,并pow取折半位最大数
for (i=1;i<(float)pow(10,digits(num)/2);i++){
//每次循环的数字位宽
int w=(float)pow(10,digits(i));
for (j=-1;j<=9;j++){
//根据位宽组合回文数,中间数比左边数小一个进制位10,从-1取,表示中间数为空状态如:1001格式
temp=i*w*(j<0?1:10)+(j>0?j:0)*w+transposition(i);
//判断并返回
if (temp>=num){break;}
sum++;
}
}
return sum;//返回回文数数量
}
//穷举法
void print2(long num){
long i,j,k,a,m=0,n=0;
for(i=1;i<=num;i++)
{
m++;
k=i;
a=0;
while(k!=0){
j=k%10;
k=k/10;
a=a*10+j;
}
if (a==i){
n++;
}
}
printf("%d\n",n);//回文数数量
}
//测试时间
int main()
{
//设置时间,并执行2个生成回文数函数。
time_t tp,tp2;
time(&tp);//运行前时间
printf("%s%ld\n","sum:",printPalindromes(859435));
time(&tp2);
//打印运行后时间
printf("%ld\n",tp2-tp);
time(&tp);
print2(859435);
time(&tp2);
printf("%ld\n",tp2-tp);
return 0;
}
codeblocks下编译通过,codeblocks gcc编译器 long是4字节,更长字节自己可以测试 long long是8字节。
因为求规律是折半求值,所以千万位数量上时间也很小,穷举法在千万位数量上比较耗时。不过穷举法简答,精巧。(上述求回文数,包括了1-9)