题目:
解题思路: 首先考虑到 M它的进制是未知的,并且100位之内,显然我们传统的 int、long long型就不能满足其要求,故这里考虑 用数组进行存储
又因为 不知道输入的时候M是多少位 直接用 int型 数组显然不方便,也不太现实。这里就用到我们 之前的帖子(P1009 高精度算法)里面讲的 用 字符型数组 转换 整形数组 。 整型数组里面存储的是 M这个数的每一位!!!
整体代码为:
#include<stdio.h>
#include<string.h>
int main()
{
int n = 0;
scanf("%d", &n);
char arr1[100] = "0";
scanf("%s", arr1);
int arr2[150] = { 0 };
int arr3[150] = { 0 };
int zu=strlen(arr1);
int i = 0;
int g = 0;
int step = 0;
for (i = 0; i <= zu - 1; ++i)
{
if (arr1[zu - i - 1] >= 'A')
{
arr2[i] = arr1[zu - i - 1] - 'A';
arr2[i] += 10;
}
else
arr2[i] = arr1[zu - i - 1] - '0';
}
int jin = 0;
do {
for (g = 149; g >= 0; --g)
{
if (arr2[g] != 0)
break;
}
for (i = 0; i <= g; ++i)
arr3[i] = arr2[g - i];
int floag = 1;
for (i = 0; i <= g / 2 + 1; ++i)
{
if (arr2[i] != arr3[i])
{
floag = 0;
break;
}
}
if (floag == 1)
{
printf("STEP=%d", step);
break;
}
else
{
step++;
jin = 0;
for (i = 0; i <=799; ++i)
{
arr2[i] = arr2[i] + arr3[i] + jin;
jin = arr2[i] / n;
arr2[i] = arr2[i] % n;
}
}
} while (step <= 30);
if (step == 31)
printf("Impossible!");
return 0;
}
代码分析
:
字符数组 用来接收输入的数字 在内存中字符是以ASC||码进行储存的
因为数字有100位 后面会 反复地加 存在进位 所以 数组大小 150 比较合适
arr2[150] arr3[150]
然后就是下面,因为可能得进制有2~10 以及16 所以要分类讨论
2~10 进制的话 其可能的数字就是 0~9 所以减去 字符‘0’ 即可 得到的就是实际输入的数字
16进制的话 有ABCDEF 这道题的测试点是默认输入大写字母哈!!!!
所以 这部分输入的数字 单独拎出来 最后+10 就好
依旧是倒着存 因为后边好进位 整体知识点和 高精度算法一样 不多赘述