70 回文数
作者: Turbo时间限制: 1S章节: 模拟
问题描述 :
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
我们现在需要产生回文数,步骤如下:
给定一个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(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入说明 :
两行,N与M
输出说明 :
如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
输入范例 :
9
87
输出范例 :
STEP=6
/**
*/
#include <stdio.h>
#include <string.h>
char transfer_number[100];
int tempory ;
int huiwen(){
//int length = strlen(transfer_number);
int i;
int j;
for (i = 0, j = tempory- 1; i <= j; i++, j--){
if (transfer_number[i] != transfer_number[j])
return 0;
}
return 1;
}
void transfer(int N, int s){
//10进制转换为对应的进制
int temp = s;
tempory = 0;
while (temp){
int t = temp%N;
if (t >= 10 && t <= 15)
transfer_number[tempory++] = 'A' + t - 10;
else transfer_number[tempory++] = t;
temp = temp / N;
}
transfer_number[tempory] = '\0';
}
int main(){
int N;//N进制 M 数字
scanf("%d", &N);
char M[100];
scanf("%s", M);//M 数字
int i;
int length = strlen(M);
int sum = 0;//转换为10进制 存储在其中
if (N == 16){
for (i = 0; i<length; i++)
{
if (M[i] >= 'A'&&M[i] <= 'F')
sum = sum*N + (M[i] - 55);
else sum = sum*N + (M[i] - '0');
}
}
else {//非16进制
for (i = 0; i<length; i++)
sum = sum*N + (M[i] - '0');
}
int count = 0;//总次数
while (count <= 30){
int sum1 = 0;//从后往前的数据
int temp = sum;
while (temp){
sum1 = sum1 * 10 + temp % 10;
temp = temp / 10;
}
int s = sum + sum1;
transfer(N, s);
count++;
if (huiwen())
{
printf("STEP=%d\n", count);
break;
}
else sum = s;
memset(transfer_number, 0, sizeof(char));
}
if (count>30)
printf("Impossible!\n");
return 0;
}
占个坑,转换为对应的进制求回文数怎么都 不对啊