题解 | [NOIP1999]回文数
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <stdio.h>
#include <string.h>
//判断一个数组中的数逆序后是否不变,是返回1,不是返回0
int Re_Able(int Num[], int Length)
{
int Left = 0;
int Right = Length - 1;
while (Left < Right)
{
if (Num[Left] != Num[Right])
{
return 0;
}
Left++;
Right--;
}
return 1;
}
//对存储在数组Num中和数组Re_Num中的N进制数做N进制加法,运算结果覆盖原来的Re_Num数组(结果为逆序),并返回结果的长度
int N_Radix_Add(int N, int Re_Num[], int Num[], int Length)
{
int i = 0;
int Signal = 0;
int Sum = 0;
for (i = 0; i <= Length; i++)
{
Sum = Re_Num[i] + Num[i] + Signal;
if (Sum >= N)
{
Sum = Sum - N;
Re_Num[i] = Sum;
Signal = 1;
}
else
{
Re_Num[i] = Sum;
Signal = 0;
}
}
if (Re_Num[Length] != 0)//如果最后一位产生进位,则结果长度加1,否则结果长度不变
{
Length = Length + 1;
}
return Length;
}
//将数组Num中的元素逆序,并将结果传入到Re_Num中
void Reverse(int Num[], int Re_Num[],int Length)
{
int i = 0;
for (i = 0; i < Length; i++)
{
Re_Num[i] = Num[Length - 1 - i];
}
}
int main()
{
int Radix = 0;
char Num_Char[100] = { 0 };
//输入进制和数字
scanf("%d", &Radix);
getchar();
scanf("%s", Num_Char);
//对输入数字进行处理
int Length = 0;
int i = 0;
int Num[100] = { 0 };
int Re_Num[100] = { 0 };
Length = strlen(Num_Char);
for (i = 0; i < Length; i++)//把char类型转换为int类型,并传入数组中
{
if (Num_Char[i] >= '0' && Num_Char[i] <= '9')//如果输入的为数字
{
Num[i] = (int)(Num_Char[i]) - 48;
}
else if (Num_Char[i] >= 'A' && Num_Char[i] <= 'E')//如果输入的为字母
{
Num[i] = (int)(Num_Char[i]) - 55;
}
}
i = 0;
Reverse(Num, Re_Num, Length);
while (Re_Able(Num, Length) == 0)//判断数组中的数是否是回文数,若是则跳出循环,不是则继续计算
{
Length = N_Radix_Add(Radix, Re_Num, Num, Length);
Reverse(Re_Num, Num, Length);
i++;//记录计算次数
if (i >= 30)//计算超过30次直接跳出循环
{
break;
}
}
//输出结果
if (i >= 30)
{
printf("Impossible!");
}
else
{
printf("STEP=%d", i);
}
return 0;
}
本人菜鸟,想了挺久的😢,大致思路就是用字符串接受输入的数字,转换成整型数组,在数组里进行N进制加法运算,然后判断运算结果是不是回文数,一开始本来想直接把整型数组里的数转换成10进制然后作加法,后面发现步数大了会溢出,只好改成在数组里一位一位的加。
