p.s.个人收录用
题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于十进制数87:
STEP1:87+78 = 165
STEP2:165+561 = 726
STEP3:726+627 = 1353
STEP4:1353+3531 = 4884
在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N,2≤N≤10,N=16)进制数M(100位之内),求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出Impossible!
输入
两行,分别是N,M。
输出
STEP=ans
样例输入 Copy
10 87
样例输出 Copy
STEP=4
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <string.h>
//回文数
//数组位数
int isPlace(int n[])
{
int i;
for (i = 199; i >= 0; i--)
{
if (n[i])
break;
}
return i;
}
//判断回文数
int isNum(int a[])
{
int flag = 1;
int i = isPlace(&a[0]);//位数
for (int j = 0; j <= i-j; j++)
{
if (a[j] != a[i - j])
{
flag = 0;
break;
}
}
return flag;
}
int main()
{
int n;
char s[200];
int m[200], a[200], b[200];
int ans = 0;
scanf("%d", &n);
scanf("%s", s);
memset(m, 0, sizeof(m));
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
int l = strlen(s);
for (int i = 0; i < l; i++)
{
if (s[i] >= '0' && s[i] <= '9')
m[i] = s[i] - '0';
else if (s[i] >= 'A' && s[i] <= 'Z')
m[i] = s[i] - 'A' + 10;
}
//加第一次
for (int i = 0; i < l; i++)
{
a[i] += (m[i] + m[l - i - 1]);
if (a[i] >= n)
{
a[i + 1] += a[i] / n;
a[i] %= n;
}
}
ans++;
int flag;
flag = isNum(&a[0]);
while(ans<=30)
{
if (flag==0)
{
l = isPlace(a);
memset(b, 0, sizeof(b));
for (int g = 0; g <= l; g++)
b[l - g] = a[g];
for (int g = 0; g < 200; g++)
m[g] = b[g];
memset(a, 0, sizeof(a));
for (int i = 0; i <= l; i++)
{
a[i] += (m[i] + m[l - i]);
if (a[i] >= n)
{
a[i + 1] += a[i] / n;
a[i] %= n;
}
}
ans++;
flag = isNum(&a[0]);
}
else
{
printf("STEP=%d\n", ans);
break;
}
}
if (ans > 30)
printf("Impossible!\n");
}