原题链接:回文数(二)
首先,说明一下,此题有会有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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复