题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
注意点:
1.10进制及以下与16进制回文数的求解方法
2.n进制相加的计算方法
3.注意可能出现数据溢出的情况,这个情况想了半天没注意到!!!!!
#include <stdio.h> #include <math.h> long long huiwen(long long M,int N)//计算M回文数 { int i; long long out=0; i=0; while(M!=0) { if(N<11) { out=out*10+M%10; M=M/10; } else { out=out*16+M%16; M=M/16; } } return out; } long long sum(long long M,long long huiwen_M,int N)//M与其回文数相加,N进制 { int num,jin=0,i=0; long long out; while(M!=0) { if(N<11) { num=M%10+huiwen_M%10+jin; out=out+num%N*pow(10,i); jin=num/N; M=M/10; huiwen_M=huiwen_M/10; i++; } else { num=M%16+huiwen_M%16+jin; out=out+num%N*pow(16,i); jin=num/N; M=M/16; huiwen_M=huiwen_M/16; i++; } } if(N<11) out=out+jin*pow(10,i); else out=out+jin*pow(16,i); return out; } int main() { int N,step=0,jud=1; long long M; scanf("%d",&N); if(N<11) scanf("%lld",&M); else scanf("%X",&M); while(M!=huiwen(M,N)) { if(step>30) { jud=0; break; } M=sum(M,huiwen(M,N),N); step++; } if(jud==1) printf("STEP=%d",step); else printf("Impossible!"); return 0; }