题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
使用字符串数组进行加法计算,不怕溢出范围。
#include <iostream> #include <cstring> using namespace std; char m[200]={0}; int ctoi(char x)//字符转int { int y=0; if(x>='A'&&x<='E') { y=x-'A'+10; } if(x>='0'&&x<='9') { y=x-'0'; } return y; } char itoc(int x) { char y; if(x<10) y=x+'0'; else y=x-10+'A'; return y; } void sum(int n)//计算x进制加法,把结果覆盖到m数组中 { char sum[200]={0};//sum记录顺序最左边为个位. int len=strlen(m),i,jw=0;//使用jw来记录进位情况 for(i=0;i<len;i++) { int x,y; x=ctoi(m[i]); y=ctoi(m[len-i-1]); int s=x+y; sum[i]=itoc((s+jw)%n); jw=(s+jw)/n; } if(jw!=0) sum[i]=itoc(jw);//最后一位进位 len=strlen(sum); for(i=0;i<len;i++)//覆盖m { m[i]=sum[len-i-1]; } } int ifhuiwen()//判断m是不是回文数 { int flag=1,len=strlen(m); for(int i=0;i<len/2;i++) { if(m[i]!=m[len-i-1]) { flag=0; break; } } return flag; } int main() { int n; scanf("%d",&n); scanf("%s",m); int count=0; while(count!=31)//包含30步 { if(ifhuiwen()) { break; } else { sum(n); count++; } } if(count==31) cout<<"Impossible!"<<endl; else cout<<"STEP="<<count<<endl; return 0; }