原题链接:回文数(二)
解题思路:
定义多个函数,分别处理遇到的问题,用户输入的位数,数字反向相加,判断同文数。
用数组去接收用户输入的第二个数会让后面的计算起来简单很多。
参考代码:
#include<stdio.h>
#include<math.h>
#include <string.h>
#include <stdlib.h>
int stod(char s[],int a[]);
int plus(int a[],int n,int m);
int check(int a[],int n);
int p;
char s[1000];
int c[1000];
main()
{
int n,i;
scanf("%d",&p); //接收进制
scanf("%s",s); //用数组接收用户输入的第一个数
n=stod(s,c); //判断用户输入了几位数,并传给n
for(i=0;i<30;i++)
{
n=plus(c,n,p); //相加
if(check(c,n)==1) //判断是否为回文数
{
printf("STEP=%d\n",i+1);
break;
}
}
if(i>=30)
printf("Impossible!\n");
}
int stod(char s[],int a[]) //统计位数
{
int i; //判断用户输入的为几位数的数字
for(i=0;s[i]!='\0';i++)
if(s[i]>='A'&&s[i]<='F') //10到16进制数
a[i]=10+s[i]-'A'; //给数组c赋值
else //2到10进制数
a[i]=s[i]-'0';
return i; //返回位数给n
}
int plus(int a[],int n,int m) //计算a=a+a反
{
int *b,i,j,k;
b=(int *)malloc(sizeof(int)*1001);//开辟空间
for(i=0;i<n;i++)
b[n-1-i]=a[i]; //把a反过来给b
k=0;
for(i=0;i<n;i++)
{
a[i]=a[i]+b[i]+k;
k=a[i]/m;
a[i]=a[i]%m;
}
if(k>0)
a[n++]=k;
free(b);
return n;
}
int check(int a[],int n) //判断a是否是回文
{
int i,j;
i=0;
j=n-1;
while(i<j&&a[i]==a[j])
{
i++;
j--;
}
return i>=j;
}看看大家还有什么不懂的请在下方评论区留言
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复