题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//翻转字符串
void reverse_str(char* str)
{
//获取字符串的长度
int n = strlen(str);
for (int i = 0; i < n/2; i++)
{
//将末字符串移动到当前位置
char temp = str[i];
str[i] = str[n - i - 1];
str[n - i - 1] = temp;
}
}
//检查字符串是否为回文
int IsPrimeNum(char* str)
{
//获取字符串长度
int len = strlen(str);
for (int i = 0; i < len; i++)
{
if (str[i] != str[len - i - 1])
//不是回文数
return 0;
}
//出来就是回文数
return 1;
}
//将数字与逆序相加
void AddRverse(int base,char*num,char*result)
{
//存放num的反转字符串
char reversed[101];
//将num复制到reversed
strcpy(reversed, num);
//反转reversed
reverse_str(reversed);
//进制的初始化
int carry = 0;
int n = strlen(num);
//存放临时求和的结果
int sum = 0;
int i = 0;
//初始化result为0
memset(result, 0, sizeof(char));
//对数字和反转数字相加
for (i = 0; i < n; i++)
{
int digit1 = (num[n - i - 1] >= 'A') ? (num[n - i - 1] - 'A' + 10) : (num[n - i - 1] - '0');
int digit2 = (reversed[n - i - 1] >= 'A') ? (reversed[n - i - 1] - 'A' + 10) : (reversed[n - i - 1] - '0');
sum = digit1 + digit2 + carry;
//转换为字符
result[i] = (sum % base < 10) ? (sum % base + '0') : (sum % base - 10 + 'A');
//更新进位
carry = sum / base;
}
//最后还有进位
if (carry > 0)
{
result[i++] = (carry < 10) ? (carry + '0') : (carry - 10 + 'A');
}
result[i] = '\0';
reverse_str(result);
}
int main()
{
int base;
char num[101];
//读取进制和数字
scanf("%d", &base);
scanf("%s", &num);
char result[101] = "";
int step = 0;
for (step = 0; step <= 30; step++)
{
if (IsPrimeNum(num))
{
printf("STEP=%d", step);
return 0;
}
AddRverse(base, num, result);
strcpy(num, result);
}
printf("Impossible!");
return 0;
}
