原题链接:回文数(二)
解题思路:
注意事项: 在这里我用数组从a[0]开始存放数的最低位,a[i]存放高位,便于适应结果数的位数增长,易实现算法
参考代码:
#include<stdio.h> #include<string.h> void transform(char s[],int a[]){ //将输入的字符串转换为int型数的集合 int i=0; while(1){ if(s[i]>='0'&&s[i]<='9') a[i]=(int)s[i]-48; else if(s[i]>='a'&&s[i]<='f') a[i]=(int)s[i]-87; else if(s[i]>='A'&&s[i]<='F') a[i]=(int)s[i]-55; else break; i++; } } void reverse(int a[],int b[],int d){ //翻转数字 int i; for(i=0;i<d;i++) b[i]=a[d-i-1]; } void add(int a[],int b[],int *d,int k){ //相加 int fla=0,i,c[100]; for(i=0;i<*d;i++){ c[i]=(a[i]+b[i]+fla)%k; fla=(a[i]+b[i]+fla)/k; } if(fla!=0){ //最终进位若为非0,则表示d+1位,不为0有效 c[i]=fla; i++; //重新调整数的位数(加1位) } *d=i; for(i=0;i<*d;i++) a[i]=c[i]; //将结果数放置到a[]数组 } int huiwen(int a[],int d){ //判断回文 int i,flag=1; for(i=0;i<d/2;i++) if(a[i]!=a[d-i-1]) flag=0;//若存在1对数不相等,则非回文,返回0,否则返1 return flag; } int main(){ int a[100],b[100]; //a存初始数(或结果数),b存翻转得到的数 int k,num=0,d; //num记录计算次数,d为数a的长度 char s[100]; scanf("%d%s",&k,s); transform(s,a); d=strlen(s); while(num<=30){ reverse(a,b,d); add(a,b,&d,k); num++; if(huiwen(a,d)) break; //执行到满足回文数时退出循环,成功! } if(num!=31) printf("STEP=%d",num); else printf("Impossible!"); return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复