洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
题目描述
如果一个数从左往右读和从右往左读都是一样,那么这个数就叫做“回文数”。例如,12321就是一个回文数,而77778就不是。当然,回文数的首和尾都应是非零的,因此0220就不是回文数。
事实上,有一些数(如21),在十进制时不是回文数,但在其它进制(如二进制时为10101)时就是回文数。
编一个程序,从文件读入两个十进制数N (1 <= N <= 15)S (0 < S < 10000)然后找出前N个满足大于S且在两种或两种以上进制(二进制至十进制)上是回文数的十进制数,输出到文件上。
本问题的解决方案不需要使用大于32位的整型
分析
由于数据很小,可以放心使用多重循环。
循环内可以这样:判断该进制(i)是否回文,是则变量(k)加1,若变量等于2,就输出这个数的十进制形态并强行退出循环(break)
#include <iostream>
#include <stdio.h>
using namespace std;
int n,s,b,i,k;
int a[1000];
bool pd(int x)
{
int s,i;
s=x;
i=0;
while (s!=0)
{
i++;
a[i]=s%b;
s=s/b;
}
for (int j=1;j<=i/2+1;j++)
if (a[j]!=a[i-j+1]) return(false);
return(true);
}
int main()
{
scanf("%d%d",&n,&s);
i=s;
while (n!=0)
{
i++;
k=0;
for (b=2;b<=10;b++)
{
if (pd(i)) k++;
if (k==2)
{
printf("%d\n",i);
n--;
break;
}
}
}
}