入门经典 第七章 7.7.4 双基回文数
December 14, 2012
双基回文数很多,所以可以暴力。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <iomanip>
using namespace std;
int trans(int n, int base)
{
int a[100], i = 1;
a[0]=n%base;
n/=base;
while (n)
{
a[i++]=n%base;
n/=base;
}
int len = i;
int mrk = 1;
for (i = 0; i < len; ++i)
{
if (a[i] != a[len-1-i])
{
mrk = 0; break;
}
}
return mrk;
}
int main(void)
{
int n;
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
#endif
while (~scanf("%d", &n))
{
int mrk = 0, cnt = 0;
for (int i = n+1; ; ++i)
{
cnt = 0;
for (int j = 2; j < 11; ++j)
{
if (trans(i, j))
{
cnt++;
if (cnt==2)
{
mrk = 1;
printf("%d\n", i);
break;
}
}
}
if (mrk)
break;
}
}
return 0;
}
注意在trans()函数中,a数组不能小于32,原因是,转化成2进制的时候,数组要足够大,刚开始只开了20,出现了错误,并且发现一个有趣的问题,i的值会竟然会自动调整!不信的话,你试试把代码改成下面这样:(只改这个地方,其他地方不变)
int trans(int n, int base)
{
int a[20], i = 1;
a[0]=n%base;
n/=base;
while (n)
{
a[i++]=n%base;
n/=base; printf("i = %d\n", i); //当 n=1600156, base = 2 的时候,运行一下
}
这个我还不知道为什么不会报数组越界,Runtime Error。。