题解 | #[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;
}
查看7道真题和解析
