首先,说明一下,此题有会有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++代码)浏览:909 |
c primer plus 第十二章 12.1小节浏览:400 |
数组输出 (C语言代码)--此题的题目描述有问题浏览:1844 |
printf基础练习2 (C语言代码)浏览:826 |
兰顿蚂蚁 (C++代码)浏览:1159 |
本人酷爱递归实现很多问题,这里也是浏览:632 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:565 |
C语言考试练习题_保留字母 (C语言代码)浏览:743 |
最小公倍数 (C语言代码)浏览:1105 |
1024题解浏览:879 |