题面:
解题:
又是USACO的一道回文数+N进制的题……与P1026的回文平方数可谓异曲同工之妙
这里就直接引用我P1026题解的相关内容了(瘫)……
N进制转化
我们知道,一个十进制数num的个位为num%10,通过num/10可剔除个位。
因此,可以推断,n进制数num的个位为n%10,通过num/n可剔除个位。
对一个数反复进行上述的两个过程,我们便可得到这个数所有位上的数字。
设置一个容器存储转化后的数,这里以vector容器为例,将一个数num转为n进制的代码如下:
vector<int>v;
int len = 0;
v.push_back(num); //v[0]=num;
while (v[len] >= n)
{
v.push_back(v[len] / n);
v[len] %= n;
len++;
}
回文判断
包含头文件<algorithm>后,我们可用reverse函数来翻转上述的vector容器v的副本v1,
再将v与v1从头比对到尾(0~len),有一项不回文则返回false
vector<int>v1 = v;//用于判断是否回文
reverse(v1.begin(), v1.end());//翻转v1
for (int i = 0; i <= len; i++)
{
if (v[i] != v1[i])return false;//有一项不同则不回文
}
return true; //回文
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, s;
bool trans(int num, int b) //将num转化为b进制数,并判断是否回文
{
vector<int>v; int len = 0;
v.push_back(num);
while(v[len]>=b)
{
v.push_back(v[len] / b);
v[len] %= b;
len++;
}
vector<int>v1 = v;
reverse(v1.begin(), v1.end());
for (int i = 0; i <= len; i++)
if (v[i] != v1[i])return false;
return true;
}
int main()
{
cin >> n >> s;
for(int i=s+1;n>=1;i++)
{
int judge = 0;
for (int j = 2; j <= 10; j++)
{
if (trans(i, j))judge++;
}
if (judge >= 2) //存在两个进制上的回文数,输出,并对n--
{
cout << i << endl;
n--;
}
}
return 0;
}