原题链接:回文数(二)
首先,说明一下,此题有会有step=0的情况出现,我看好多题解都没有这个情况,所以特此来写一写题解。
其次,此题需要考虑10进制以上的进制输入情况有字母,就必须用字符串数组进行。之前因为没考虑到这个老是不过
然后就是基本的代码了
代码很简单
参考如下:
#include<iostream>
#include<stdlib.h>
#include<string.h>
#define max 60 //位数其实设置为51就够了,因为longlong最长20位,叠加30次,就算每次有进位,最大也就51位长度
using namespace std;
int main()
{
int a[max]= {0},b[max]= {0},i=0,step =0,n,len;//a数组用来存储数字 按照0-》max 低位-》高位存储
char m[100]; //输入必须用字符串类型
cin>>n>>m;
len = strlen(m);
while(i!=len) //将输入的数字按位转换到数组a中 因为是n进制存储每位数字,其实当n>10时,a[i]也是可以存10、11、12、--15的数字的
{ // 这里应该能转过弯来
if(m[i]>='A'&&m[i]<='F') a[i] = 10+m[i]-'A';
else if(m[i]>='a'&&m[i]<='f') a[i] = 10+m[i]-'a';
else a[i]=m[i]-48;
i++;
}
while(1)
{
int j=0,k=max-1;
while(a[k--]==0);; //获取数字的位数 为k+1位
for( j=0; j<=(k+1)/2; j++) //判断是否为回文数 只需判断前一半与后一半是否相等就行
if(a[j]==a[k+1-j]) continue; //如果相等 继续
else break; //如果不等 跳出
if(step>30) //如果步数大于30步,输出 ,然后退出
{
cout<<"Impossible!"<<endl;
return 0;
}
if(j>(k+1)/2) //如果判断回文数的j都是continue,那么说明是回文数, 输出,退出
{ //这里需要说明,如果输入的本身就是一个回文数,则会输出0步,而不是其他题解的1步
cout<<"STEP="<<step<<endl;
return 0;
}
else //如果不是回文数, 按题意相加
{
step++; //步数+1
int flag =0; //进位置零
for(j=0; j<=k+1; j++) //把a保存到b
b[j]=a[j];
for(j=0; j<=k+1; j++)
{
a[j]=(b[j]+b[k+1-j]+flag)%n; //按题意头尾相加,并把进位加上,然后才是取余得到本位的数
flag = (b[j]+b[k+1-j]+flag)/n;//得到进位 0或者1
}
a[j] = flag; //不管是0还是1,都直接把他赋给高位
}
}
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复