描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数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>10时,使用大写'A'字母表示10,'B'表示11,...,'E'表示16
输入描述:
两行,分别为N,M
输出描述:
STEP=ans
示例1
输入:
9 87
输出:
STEP=6
#include <stdio.h>
#include <string.h>
#include <math.h>
void Re(char* ch, char* Rech)
{
int i = 0;
int weishu = strlen(ch);
int j = 0;
for (j = 0; j < weishu; j++) {
Rech[j] = ch[weishu - 1 - j];
}
}
void Change(char* ch, long long sum, int N)
{
int i = 0;
long long mid = 0;
long long shang = 0;
long long yu = 0;
char jinzhi[200] = { 0 };
shang = sum;
for (i = 0;; i++) {
yu = shang % N;
shang = shang / N;
if (yu >= 10)
jinzhi[i] = yu + 55;
else
jinzhi[i] = yu + 48;
if (0 == shang)
break;
}
mid = i;
for (i = 0; i <= mid; i++) {
ch[i] = jinzhi[mid - i];
}
}
int main()
{
int N = 0;
char ch[200] = { 0 };
int i = 0;
int count = 0;
long long M = 0;
long long ReM = 0;
int weishu = 0;
int j = 0;
long long sum = 0;
char Rech[200] = { 0 };
scanf("%d", &N);
getchar();
for (i = 0;; i++) {
ch[i] = getchar();
if ('\n' == ch[i]) {
ch[i] = '\0';
break;
}
}
Re(ch, Rech);
for (i = 1; i < 31; i++) {
weishu = strlen(ch);
if (!strcmp(ch, Rech)) {
printf("STEP=%d\n", count);
break;
}
else {
count++;
M = 0;
ReM = 0;
for (j = 0; j < weishu; j++) {
if (ch[j] >= 'A') {
M += (ch[j] - 55) * pow(N, weishu - 1 - j);
}
if (ch[j] < 'A') {
M += (ch[j] - 48) * pow(N, weishu - 1 - j);
}
if (Rech[j] >= 'A') {
ReM += (Rech[j] - 55) * pow(N, weishu - 1 - j);
}
if (Rech[j] < 'A') {
ReM += (Rech[j] - 48) * pow(N, weishu - 1 - j);
}
}
sum = M + ReM;
Change(ch, sum, N);
Re(ch, Rech);
}
}
if (31 == i)
printf("Impossible!\n");
return 0;
}
由于不同进制之间的逆序并无关联,所以在判断逆序时并不能用其他进制进行逆序判断,再者由于非二进制、十进制、十六进制的数字运算比较麻烦,所以想到将输入以字符的形式存储,并以字符串的方式判断逆序,在计算时将字符化为十进制数字进行计算,最后再化为字符变量放入数组进行逆序判断。要注意在写程序的过程中,对于需要循环使用的变量,看看其是否需要在循环中的操作执行前进行初始化。
这篇博客讨论了一种程序设计问题,即如何找到一个给定进制数在不超过30步内变为回文数的最短路径。程序通过字符存储和字符串操作处理不同进制间的逆序判断,同时涉及进制转换和回文数的检测。在循环中,不断对原数和其逆序数相加,直到找到回文数或者超过30步,若30步内无法得到回文数则输出'Impossible!'。该问题结合了进制转换、字符串处理和回文数的算法实现。

2472

被折叠的 条评论
为什么被折叠?



