解题思路: 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!");
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复