试题 算法训练 回文数

跟風遠走 提交于 2020-03-02 07:30:59

试题 算法训练 回文数

题目描述:

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

又如:对于10进制数87:
  STEP1:87+78 = 165 STEP2:165+561 = 726
  STEP3:726+627 = 1353 STEP4:1353+3531 = 4884

在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
  两行,N与M
输出格式
  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6

注意:

中间加法计算过程需将字符数组转化为普通int型数组(这么做方便计算)。

AC代码:

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int m;
int main()//比如:87+78 = 165 165+561 = 726 726+627 = 1353 1353+3531 = 4884
{
	int m;//n为数 
	char a[100];//a字符数组存储一个m进制的数字 
	cin>>m>>a;
	int i,j,k=strlen(a);
	int temp;
	int Flag=0;
	for(i=0;i<30;i++)//循环次数 
	{
		int flag=0;
		for(j=0;j<k/2;j++)
			if(a[j]!=a[k-j-1])
			{
				flag=1;//不是回文数 
				break;
			}
		if(!flag)//是回文数 
		{
			cout<<"STEP="<<i<<endl;
			Flag=1;//是否可以在30步内计算出来 
			break;
		}
		else//不是回文数 ,继续操作 
		{
			int aa[100],mm;
			
			//将a数组字符转化为int型数字,然后存储到数组aa中(这么做是为了方便后续加法计算)
			for(j=0;j<k;j++) 
			{
				if(a[j]>='0'&&a[j]<='9')
				mm=(int)(a[j]-'0');
				else
				mm=(int)(a[j]-'A'+10);
				aa[j]=mm;
			}
			int bb[100],sumsum[100]; //bb存储逆序的aa数组数据,sumsum存储aa数组与bb数组的和 
			
			int t=0;
			for(j=k-1;j>=0;j--)//将数组aa逆序存储在bb数组中 (其中t==k) 
				bb[t++]=aa[j];
				
			int r=0,kk=0;//kk为sumsum数组的长度 
			int temp;
			for(j=k-1;j>=0;j--)//加法计算(从最后一位逆序向前计算) 
			{
				temp=aa[j]+bb[j]+r;
				sumsum[kk++]=temp%m;
				r=temp/m;
			}
			while(r)
			{
				sumsum[kk++]=r%m;
				r/=m;
			}
			int lenSum=0;//lenSum==kk
			char sum[100];
			char ch;
			for(j=kk-1;j>=0;j--)//将sumsum数组数据转化为字符存储在sum中 
			{
				if(sumsum[j]>=0&&sumsum[j]<=9)
					ch=(char)(sumsum[j]+'0');
				else 
					ch=(char)('A'+sumsum[j]-10);
				sum[lenSum++]=ch;
			}
			k=0;
			for(j=0;j<kk;j++)//将数组sum内容拷贝给数组a 
				a[k++]=sum[j];
		}
	} 
	if(!Flag)
	cout<<"Impossible!"<<endl;
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!