原题链接:回文数(二)
参考代码:
//要满足2~16之间的任意进制,假设用 A B C D E F,分别表示 10 11 12 13 14 15
#include <stdio.h>
char* copystr(char aim[],char b[]); //把字符串b 拷贝到数组 aim[] 中
char* zh_to_char(long x,int jinzhi,char y[]); //把十进制长整数按照需要的进制,转换成 字符串
int huiwenshu(char x[]); //判断字符串是否是回文数
long zh_to_d(char x[],int jinzhi); //把字符串 按照需要的进制,转换成长整数
int len(char x[]); //字符串的长度
char* fanxu(char x[]); //将字符串反序保存
int main(void){
int jinzhi;
char x[50];
char y[50];
int i = 0; //表示计算的步数
scanf("%d",&jinzhi);
fflush(stdin); //清空缓存
scanf("%s",x);
long tmp;
for(i = 0;i<=30;i++){
if(huiwenshu(x)) break; //如果输入的数本身就是回文数,步数为0,直接跳出
else{
copystr(y,x);
fanxu(x);
tmp = zh_to_d(x,jinzhi) + zh_to_d(y,jinzhi);
zh_to_char(tmp,jinzhi,x);
}
}
if(i>30) printf("Impossible!\n");
else printf("STEP=%d\n",i);
return 0;
}
char* copystr(char aim[],char b[]){
int i = 0;
while(b[i] != '\0'){
aim[i] = b[i];
i++;
}
aim[i] = '\0';
return aim;
}
char* fanxu(char x[]){
int n = len(x);
char a[n];
int i;
i = 0;
while(x[i] != '\0'){
a[i] = x[n-2-i];
i++;
}
a[i] = '\0';
for(i = 0;i<n;i++){
x[i] = a[i];
}
return x;
}
int len(char x[]){
int n = 0;
while(x[n]!= '\0'){
n++;
}
return n+1;
}
long zh_to_d(char x[],int jinzhi){
long res = 0;
int i = 0;
while(x[i]!='\0'){
switch(x[i]){
case 'A':
res = res*jinzhi+10;
break;
case 'B':
res = res*jinzhi+11;
break;
case 'C':
res = res*jinzhi+12;
break;
case 'D':
res = res*jinzhi+13;
break;
case 'E':
res = res*jinzhi+14;
break;
case 'F':
res = res*jinzhi+15;
break;
default:
res = res*jinzhi+x[i]-'0';
break;
}
i++;
}
return res;
}
int huiwenshu(char x[]){
int i;
int n = len(x);
char y[n];
copystr(y,x);
fanxu(x);
for(i = 0;i<n;i++){
if(x[i] != y[i]) break;
}
if(i <n) return 0;
else return 1;
}
char* zh_to_char(long x,int jinzhi,char y[]){
int i;
long tmp = x;
for(i = 0;i<100;i++){
tmp = x%jinzhi;
switch(tmp){
case 10:
y[i] = 'A';
break;
case 11:
y[i] = 'B';
break;
case 12:
y[i] = 'C';
break;
case 13:
y[i] = 'D';
break;
case 14:
y[i] = 'E';
break;
case 15:
y[i] = 'F';
break;
default:
y[i] = tmp + '0';
break;
}
x = x/jinzhi;
if(x == 0) {
i++;
y[i] = '\0';
break;
}
}
fanxu(y);
return y;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复