hqd125


私信TA

用户名:hqd

访问量:2934

签 名:

若MS WPS没有把握,何不把时间花在C上面?一举两得

等  级
排  名 383
经  验 5154
参赛次数 5
文章发表 6
年  龄 0
在职情况 教师
学  校
专  业

  自我简介:

学练同步,知行合一,希望大家都能理论与动手结合,拒绝理论派! 前期扎实学习打基础,后期快乐练习过二级!

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

  评论区

  • «
  • »