解题思路

用一个数组保存所要算的数的每一位,如10进制87->逆序存储 a 数组={7,8};

 8 7        
+7 8
————
15 15

因为我们是逆序存储的,所以数组从0开始相加,就得到了15 15;又因为87是10进制,所以进位就减去10(n进制就减去n),每大于n,下个下标的数组的值+1,例如(10进制87);

 8 7               8 7            8 7            8 7
+7 8              +7 8           +7 8           +7 8 
-----    --->  ---------  ---> --------- ---> -------
15 15             15 15          15 15          15 15
15+1 15-10        16  5        16-10 5        1  6  5

末位要是大于n,长度要增加。

每做完一次,又重新更新 a 数组,以便判断不是回文时再继续相加.

判断:

for(i=0;i<L/2;i++)

只需做一半,如果是回文,那么前后左右都一样,不是直接标记flag=0,跳出当前循环。

剩下的就是判断了.

注意事项:

参考代码:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{	
	long long i=0,n,m,L,k=0,a[1000]={0},b[1000]={0};		
	cin>>n; cin>>m;//n进制数m
	while(m)   //存储每一位数字
	{
		a[i]=m%10;	
		m=m/10;
		i++;
	}	
	L=i;		
	while(1)
	{
		for(i=0;i<L;i++)			
			b[i]=a[i]+a[L-i-1];		//首尾相加
		for(i=0;i<L;i++)
		{
			if(b[i]>=n)         //多少进制就大于等于多少,就减去多少进位
			{
				b[i]=b[i]-n;				
				b[i+1]=b[i+1]+1;
				if(i==L-1) L++;    //最后一个要是超出了n,那么再给多一个下标保存,便于判断
			}
			a[i]=b[i];         //循环利用(第一个for)
		}		
		a[i]=b[i]; k++;
		int flag=1;
		for(i=0;i<L/2;i++)
			if(b[i]!=b[L-i-1]) 
			{
				flag=0;break;
			}
		if(flag && k<=30)
		{
			cout<<"STEP="<<k<<endl;break;
		}
		if(k>30)
		{
			cout<<"Impossible!"<<endl;break;
		}
	}
	return 0;
}


点赞(2)
 

0.0分

10 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论