首先,说明一下,此题有会有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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论