参考代码:

//要满足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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论