题解 | #[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;
}

全部评论
这个N进制相加函数写的好巧妙。
点赞
送花
回复
分享
发布于 03-16 21:38 河南

相关推荐

3 收藏 评论
分享
牛客网
牛客企业服务