解题思路:  1,考虑到十进制以上,用字符串数组储存所输入的数字。

                2,编写change函数将字符串数组的元素全部转化成数字,再储存在全局数组a中;

                3,用len 记录数组a的长度,便于访问;

                4,add函数用于逆转得到一个新数字与原来的数字相加,得到的新数字储存在a中;

                5,fun函数用于判断回文数;

                6,主函数用while循环判断               


注意事项:len是会变的;最后一次k可以为1

参考代码:

#include<stdio.h>

#include<string.h>

int len;//记录数组a长度

int a[1000];

void change(char b[])//将数组元素全部化为数字并储存在a中

{

    int i = 0;

    while(b[i])

    {

        if(b[i]>='A'&&b[i] <= 'F')//10进制以上的转化

            a[i] = b[i] - 'A' + 10;

        else

            a[i] = b[i] - '0';

        ++i;

    }

    len = i;//记录最初数组a的长度

    //printf("%d\n\n",len);

}

void add(int b[],int m)//将数组逆序存放后相加并储存在数组b中

{

    int i,b1[1000],k=0;

    for(i = 0;i < len;++i)

        b1[len-1-i] = b[i];

    

    for(i = 0;i < len;++i)

    {

        b[i] = b1[i]+b[i]+k;//各个位相加,k为上一位的溢出值

        k = b[i]/m;//有溢出则k = 1;else k = 0;

        b[i] = b[i]%m;//确保b[i]没有溢出

    }

    if(k>0)//如果k>0,则下一位为k(也就是1)

    b[len++] = k;

    //printf("%d\n",len);

}

int fun(int b[])//判断回文数

{

    int i;

    for(i = 0;i < len/2;++i)

        if(b[i]!=b[len-1-i])

        return 0;

    return 1;

}

int main()

{

    int n,t = 0;

    char m[1000];

    scanf("%d",&n);scanf("%s",m);

    change(m);

    while(!fun(a)&&t<=30){

        add(a,n);//不满足条件则调用add函数得到新的数字

        ++t;

    }

    if(t<=30) printf("STEP=%d",t);

    else printf("Impossible!");

}


点赞(1)
 

0.0分

0 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论