原题链接:回文数(二)
解题思路:首先我的第一想法是将n进制数转换为十进制数,然后让十进制数进行相加并判断相加后的十进制数是否为回文数,当然这样并不行。后面我又想我可不可以将相加后十进制数转回原来的进制,但是这样又太麻烦了。所以首先是先翻转数字,然后将这两个n进制数进行相加并判断是否为回文数。
注意事项:如果带有字母的话,程序就无法运行,所以还可以继续完善。本题没有考虑字母就可以通过,如有什么问题,请各位大佬指正!
参考代码:
#include <stdio.h>
#include <math.h>
int numAdd(int n,int a,int b)//n进制加法
{
int arr[10],i=0,res=0;
int aa,bb,s,t=0;
while(1)
{
aa=a%10;
bb=b%10;
s=aa+bb+t;
if(s<n)
{
arr[i]=s;
t=0;
}
else
{
arr[i]=s%n;
t=1;
}
a/=10;
b/=10;
i++;
if(a==0&&t==0)
break;
}
for(int j=i-1;j>=0;j--)
{
res=(res+arr[j])*10;
}
return res/10;
}
int revNum(int n)//翻转数字
{
int s=0;
while(n)
{
int t=n%10;
s=(s+t)*10;
n/=10;
}
return s/10;
}
int isHuiwen(int n)//判断是否为回文数
{
int a[10],i=0;
while(n)
{
a[i]=n%10;
n/=10;
i++;
}
for(int j=0;j<i/2;j++)
{
if(a[j]!=a[i-j-1])
return 0;
}
return 1;
}
int main()
{
int n,m,i;
scanf("%d%d",&n,&m);
int t=revNum(m);
for(i=1;i<=30;i++)
{
if(isHuiwen(numAdd(n,m,t)))
break;
m=numAdd(n,m,t);
t=revNum(m);
}
if(i>30)
printf("Impossible");
else
printf("STEP=%d",i);
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复