原题链接:回文数(二)
解题思路:
注意事项: 在这里我用数组从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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复