若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 121121 是一个回文数。
又如:对于十进制数 8787:
STEP1:87+78=165 87+78=165
STEP2:165+561=726 165+561=726
STEP3:726+627=1353 726+627=1353
STEP4:1353+3531=4884 1353+3531=4884在这里的一步是指进行了一次 NN 进制的加法,上例最少用了 44 步得到回文数 48844884。
写一个程序,给定一个 N进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 3030 步以内(包含 3030 步)不可能得到回文数,则输出 Impossible!。
输入格式两行,分别是 NN,MM。
输出格式如果能在 3030 步以内得到回文数,输出格式形如 STEP=ans,其中 ansans 为最少得到回文数的步数。
否则输出 Impossible!
题目描述非常长啊,但概括来说就是问输入一个高精数,30步以内能不能得到回文数
代码很好想,一个30次的循环,每次用高精来完成上述加的内容,再判断是不是回文数就行
高精代码:
void add(){
for(int i=0 ; i= n){ //超过,要进位
a[i+1]++; //进位
a[i]-=n; //这一位得减去进位的数
}
}
while(!a[len-1]) len--; //删前导零
}
判断回文代码:
int check(){
for(int i=0 ; i
是不是很好想?然后主函数里面根据题目来模拟就行
总代码:
#include
using namespace std;
int len;
char a[110],b[110];
int n;
int check(){
for(int i=0 ; i= n){
a[i+1]++;
a[i]-=n;
}
}
while(!a[len-1]) len--;
}
int main(){
scanf("%d",&n);
int step = 0;
cin >> a;
len = strlen(a);
for(int i=0 ; i= '0' && a[i] <= '9') a[i] -= '0'; //将字符转化为数字
else a[i] = a[i] - 'A' + 10; //16进制的情况
}
while(!check()){
step++;
if(step > 30) break;
add();
}
if(step <= 30) printf("STEP=%d",step);
else printf("Impossible!");
return 0;
}



