题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个十进制数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=answer
输入输出样例
输入 #1复制
10
87
输出 #1复制
STEP=4
c语言代码
#include <stdio.h>
#include <string.h>
void FanZhuan(char m[],char t[]); //将m数组中的数据反转存入t数组
void XiangJia(char m[], char t[], int n); //把m,t两数组相加,n为进制
int ShiLiu(char c); //如果是十六进制,把对应字符(1,2,3~a,b,c,~) 换成对应的数字
int judge(char m[], char t[]); //判断是不是回文字符串
char sL[] = "0123456789abcdef"; //用于接收十六进制字符对应的数字,下标为对应的数
int main(void)
{
int n; //进制数
scanf("%d\n",&n);
char m[200]; //用于接收输入的数字
char t[200]; //接收反转后的数字
scanf("%s",m);
if(n == 16){ //sL数组存的是小写字母,如果输入大写转为小写
int i;
for(i=0; i<strlen(m); i++){
if(m[i] >= 'A' && m[i] <='Z'){
m[i] = m[i] + ('a'-'A');
}
}
}
FanZhuan(m,t); //反转存入t
int count = 0; //记录加了多少次
while((!judge(m,t)) && (!(count>30))){ //判断
count++;
XiangJia(m,t,n);
}
if(count>30){
printf("Impossible!");
}else{
printf("STEP=%d",count);
}
return 0;
}
void FanZhuan(char m[],char t[]){ //遍历字符数组,从m的尾开始给t的头赋值
int i,j;
for(i=strlen(m)-1,j=0; i>=0; j++,i--){
t[j] = m[i];
}
t[j] = '\0'; //让t数组最后一个字符为结束标志
}
void XiangJia(char m[], char t[], int n){
if(n<=10){
int i;
int jinYi = 0; //进一标识
for(i=0; i<strlen(m); i++){ //遍历数组开始计算
int p = m[i]-'0' + t[i]-'0' + jinYi; //p表示对应位置相加后的再可能加上进一后的值
jinYi = 0; //如果进一了,用完后回到0
if(p < n){ //如果是小于进制数的,直接放数组对应位置里
t[i] = p + '0'; //加 '0'后是对应的数字字符
}else{
t[i] = (p%n) + '0'; //大于对应进制,放入对进制取余的余数
jinYi = 1; //进一
}
}
if(jinYi == 1){ //如果最后两位数计算也进一了,后面一个位置进一
t[i] = '1';
t[i+1] = '\0'; //放入结束标志
}
FanZhuan(t,m); //t数组计算的结果正好与正确的值是相反的,反转t传入m
}else{
int i; //十六进制的处理,与上述类似
int jinYi = 0;
for(i=0; i<strlen(m);i++){
int m1 = ShiLiu(m[i]);
int t1 = ShiLiu(t[i]);
int p = m1 + t1 + jinYi;
jinYi = 0;
if(p < n){
t[i] = sL[p];
}else{
t[i] = sL[p%n];
jinYi = 1;
}
}
if(jinYi == 1){
t[i] = '1';
t[i+1] = '\0';
}
FanZhuan(t,m);
}
}
int ShiLiu(char c){
int i;
for(i=0; i<16; i++){
if(sL[i] == c){
return i;
}
}
return -1;
}
int judge(char m[], char t[]){
int i;
for(i=0; i<strlen(m); i++){
if(m[i] != t[i])
return 0;
}
return 1;
}
感觉题还是比较麻烦的,首先输入的进制的问题,其次数最大有100位所以只能用字符串来装。