题目描述 Description
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165 STEP2:165+561 = 726
STEP3:726+627 = 1353 STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<=N<=10或N=16)进制数M,求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入描述 Input Description
n和m
输出描述 Output Description
步数
样例输入 Sample Input
9
87
样例输出 Sample Output
STEP=6
数据范围及提示 Data Size & Hint
e
配了半天。。。又点乱
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
char m[50]={0};
bool check(){
int tmp = strlen(m),i;
for(i=0;i<tmp/2;i++){
if(m[i]!=m[tmp-1-i])
return false;
}
return true;
}
void sum(){
int tmp = strlen(m);
char a[50]={0};
char b[50]={0};
char c[50]={0};
int z=49;
for(int i=0;i<tmp;i++){
a[z]=m[i];
b[z--]=m[tmp-1-i];
}
z=49;
int s;
c[49]='0';
while(a[z]){
//s=a[z]-'0'+b[z]-'0'+c[z]-'0';
int x,y,zz;
if(a[z]>='0'&&a[z]<='9')
x=a[z]-'0';
else
x=a[z]-55;
if(b[z]>='0'&&b[z]<='9')
y=b[z]-'0';
else
y=b[z]-55;
if(c[z]>='0'&&c[z]<='9')
zz=c[z]-'0';
else
zz=c[z]-55;
s=x+y+zz;
int k=s%n,k1=s/n;
if(k>=10)
k+=55;
else
k+=48;
if(k1>=10)
k1+=55;
else
k1+=48;
c[z]=k;
c[z-1]=k1;
z--;
}
int j=0;
if(c[z]=='0')z++;
for(;z<50;z++){
m[j++]=c[z];
}
m[j]=0;
}
int main(){
scanf("%d %s", &n, m);
//判断是否是回文数
if(check())
{
printf("STEP=0\n");
return 0;
}
for(int i=0;i<30;i++){
//加
sum();
//判断是否是回文数
if(check())
{
printf("STEP=%d\n",i+1);
return 0;
}
}
printf("Impossible!\n");
return 0;
}