题目:
对于一个自然数n,若将n的各位数字反向排列所得的数n1与n相等,则称n为回文数,例如2332。
若给定一个N( 2<=N<=16)进制数M(M的长度在一百位以内),如果M不是回文数,可以对其进行N进制加法,最终得到回文数。
例如对于十进制数79 STEP1 : 79 + 97 = 176 STEP2 : 176 + 671 = 847 STEP3 : 847 + 748 = 1595 STEP4 : 1595 +5951 = 7546 STEP5 : 7546 + 6457 = 14003 STEP6 : 14003 + 30041 = 44044
那么对于给定的N进制数M,请判断其能否在30步以内(包括30步)得到回文数。
输入格式:
第一行包括一个正整数 N(2<=N<=16)。
第二行包括一个正整数M(一百位以内)。
输出格式:
如果可以在n步内得到回文数,输出“STEP=n”,否则输出“NO”。
输入样例1:
10
79
输出样例1:
STEP=6
输入样例2:
8
665556
输出样例2:
NO
题意分析:
解题思路:
具体算法流程:
实现细节(代码):
#include<bits/stdc++.h>
using namespace std;
string m;
char n1[105],n2[105],n3[105];
int t1,t2,t3,t;
int ans,n;
int jiafa(char a[105],int aa,char b[105],int bb) {
memset(n3,0,sizeof(n3));
t3=aa;
for(int j=1; j<=t3; j++) {
if((b[j]+a[j]+n3[j])>=n) {
n3[j+1]=(n3[j]+a[j]+b[j])/n;
n3[j]=(n3[j]+a[j]+b[j])%n;
} else {
n3[j]+=a[j]+b[j];
}
}
if(n3[t3+1]!=0) t3++;
}
bool panduan(char a[105],int aa) {
for(int i=1; i<=aa/2; i++) {
if(a[i]!=a[aa-i+1]) return 0;
}
return 1;
}
int main() {
cin>>n>>m;
t=m.size();
for(int i=0; i<t; i++) {
if(m[i]>='0'&&m[i]<='9') {
n3[i+1]=m[i]-48;
} else {
if(m[i]=='A') n3[i+1]=10;
if(m[i]=='B') n3[i+1]=11;
if(m[i]=='C') n3[i+1]=12;
if(m[i]=='D') n3[i+1]=13;
if(m[i]=='E') n3[i+1]=14;
if(m[i]=='F') n3[i+1]=15;
}
}
t3=t;
if(panduan(n3,t3)==1) cout<<"STEP=0";
else {
while(panduan(n3,t3)==0&&ans<=30) {
ans++;
t1=t3;
t2=t3;
for(int i=1; i<=t1; i++) {
n1[i]=n3[i];
}
for(int i=1; i<=t2; i++) {
n2[i]=n3[t2-i+1];
}
jiafa(n1,t1,n2,t2);
}
if(panduan(n3,t3)==0) cout<<"NO";
else cout<<"STEP="<<ans;
}
}