解题思路:
1、创建变量步数step = 0,右读的数字r_N,左读的数字l_N,十进制的右读和左读数字r_Ten,l_Ten
2、循环(判断是否是回文数)
若不是,则计算出从右读的数字,再将这两个数字转化为10进制数,进行加法计算,再转化成N进制数
步数+1
3、若是,则判断步数是否小于等于30,再输出相应的文本
注意事项:
1、这里最重要的是最后那个函数的代码
2、十进制和n进制之间的转化都用的是平时手算时候的技巧
参考代码:
主函数代码#include
int isreturn(int n);
int ten(int n, int N);
int turn_n(int n, int N);
int right(int n);
int main(int argc, char* argv[])
{
int step, r_N, l_N, r_Ten, l_Ten, N, sum_Ten;
step = 0;
scanf("%d%d", &N, &l_N);
while (isreturn(l_N) == 0)
{
r_N = right(l_N);//计算出右读的数字
sum_Ten = 0;
/*转化为十进制数*/
r_Ten = ten(r_N, N);
l_Ten = ten(l_N, N);
sum_Ten = r_Ten + l_Ten;//计算十进制下的和
l_N = turn_n(sum_Ten, N);//转化为n进制,并赋值给下一个数
step++;
}
/*当是回文数字的时候,输出*/
if (step <= 30)
{
printf("STEP=%d\n", step);
}
else
{
printf("Impossible\n");
}
return 0;
}
判断是否是回文数函数代码/*判断是否为回文数,是的话返回1,否则返回0*/
int isreturn(int n)
{
if (n == right(n))
{
return 1;
}
return 0;
}
n进制转化成十进制,返回十进制数
例如:9进制的87转化为10进制数
8*9[1]+7*9[0] = 79(十进制)[x]表示x次方int ten(int n, int N)
{
int m = 0, temp, i = 0;
while (n > 0)
{
temp = 1;
/*得到乘数*/
for (int j = 0; j
{
temp = temp * N;
}
m += temp * (n % 10);
n = n / 10;
i++;
}
return m;
}
十进制转化为N进制,返回n进制数
n除以N的余数乘以1
除数再除以N乘以10
.....int turn_n(int n, int N)
{
int m = 0, temp = 1;
while (n > 0)
{
m += temp * (n % N);
temp *= 10;
n = n / N;
}
return m;
}
计算右读的数字,返回右读的数字
1、将n的每一个数字从个位开始取出来,放到数组中
2、循环
让数组的第一个数乘以10的(i-1)次方
将这个数字加到m中
数组位置++,(i-1)次方数--
3、返回这个右读的数字int right(int n)
{
int m = 0, i = 0, temp;
int num[10] = { 0 };
/*当n大于0时*/
while (n > 0)
{
num[i] = n % 10;//个位数给数组
n = n / 10;
i++;
}
for (int j = 0; i > 0; j++)
{
temp = 1;
/*得到数组对应的乘数*/
for (int k = 1; k
{
temp *= 10;
}
m += temp * num[j];
i--;
}
return m;
}