题解 | #[NOIP1999]回文数#

想死我了
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
#include<string.h>
char c[100] = {0};
bool IsPalindrome(char* p, int len)
{
     
    int left = 0;
    int right = len - 1;
    while ((left) < (right))
    {
        if (p[left++] != p[right--])
            return false;
    }
    return true;
}
int getInt(char n)//将'0'-'9'转换为0-9;'a'-'z'转换成10-35
{
    if (n >= '0' && n <= '9')
        return n - '0';
    else
    {
        return n - 'A' + 10;
    }
}
char getChar(int n)//将0-9转换为'0'-'9';a-z转换成’a'-‘z'
{
    if (n >= 0 && n <= 9)
        return n + '0';
    else
        return n - 10 + 'A';
}
void Add(char* a,int N,int len)
{
    int sum1 = 0;
    int sum2 = 0;
    int tail = 0;
    int begin = 0;
    int end = len - 1;
    int i = 0;
    while (end >= 0)
    {
        sum1 = getInt(a[begin]);
        sum2 = getInt(a[end]);
        c[i] = getChar((sum1+sum2+tail)%N);
        tail = (sum1 + sum2 + tail) / N;
        end--;
        begin++;
        i++;
 
    }
    while (tail > 0)
    {
        c[i] = getChar(tail % N);
        tail /= N;
        i++;
    }
 
}
int main()
{
    char a[100] = {0};
    int N = 0;
    scanf("%d", &N);
    getchar();
    scanf("%s", a);
    int len = strlen(a);
    if (IsPalindrome(a, len))
    {       printf("STEP=%d\n",1);
    return 1;
}
    int count = 0;
    while (!IsPalindrome(a,len))
    {
        Add(a,N,len);
        strcpy(a,c);
        len = strlen(c);
        count++;
        if (count >= 31)
        {
            printf("Impossible!\n");
            return 0;
        }
 
    }
 
    printf("STEP=%d\n",count);
    return 0;
}

全部评论

相关推荐

弦五Strings:他之所以会举报你代课是因为在这种人眼里正常上课就是正义代课就是邪恶,典型二极管思维,处理方法就是私下沟通,你就说你自己家里经济困难或者家里父母生病什么之类的,需要去打工挣钱,用尽孝的正义对冲他认为的上课的正义,他可能就妥协了。
我的实习日记
点赞 评论 收藏
分享
MinJerous:虽然我一直说 计算机不怎么卡学历 但是至少得一本
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务