字符串编程(3)——高精度任意进制加法找回文数

问题描述

  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将5665(即把56从右向左读),得到121是一个回文数。
  又如:对于10进制数87
  STEP187+78 = 165 STEP2165+561 = 726
  STEP3726+627 = 1353 STEP41353+3531 = 4884
  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884
  写一个程序,给定一个N进制数M(十进制以上用ABC代替),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!

输入格式

  两行,NM

输出格式

  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)


C++ Code:

#include<iostream>
#include<string>
using namespace std;
int N;
string M;
string fanxiang(string str)
{
	int i;
	char temp;
	int le=str.length();
	for(i=0;i<le/2;i++)
	{
		temp=str[i];
		str[i]=str[le-i-1];
		str[le-i-1]=temp;
	}
	return str;
}
int ishuiwen(string str)
{
	int i;
	int len=str.length();
	char temp;
	for(i=0;i<len/2;i++)
	{
		if (str[i]!=str[len-i-1])
			return false;
	}
	return true;
}
int char2int(char A)
{
	if (A>'9')
		return A-'A'+10;
	else
		return A-'0';
}
char int2char(int n)
{
	if (n>9)
		return n+'A'-10;
	else
		return n+'0';
}
string addAB(string A,string B)
{
	int lenA,lenB,i,j,temp=0,s;
	string AB="";
	lenA=A.length();
	lenB=B.length();
	i=lenA-1;
	j=lenB-1;
	while(1)
	{
		s=char2int(A[i])+char2int(B[j])+temp;
		if (s<N)
		{
			temp=0;
			AB=string(1,int2char(s))+AB;
		}
		else
		{
			temp=s/N;
			AB=string(1,int2char(s%N))+AB;
		}
		if (i==0&&j==0)
			break;
		if (i==0)
			A[i]='0';
		else
			i--;
		if (j==0)
			B[j]='0';
		else
			j--;
	}
	if (temp==0)
		return AB;
	else
		return string(1,int2char(temp))+AB;
}
void diedai()
{
	string temp=M;
	int i,sp=0;
	for (i=0;i<30;i++)
	{
		temp=addAB(M,fanxiang(M));
		cout<<M<<"+"<<fanxiang(M)<<"="<<temp<<endl;
		if (ishuiwen(temp))
		{
			sp=1;
			break;
		}
		else
			M=temp;
	}
	if (sp==1)
		cout<<"STEP="<<i+1<<endl;
	else
		cout<<"Impossible!"<<endl;
}
int main()
{
	while(1)
	{
		cin>>N;
		cin>>M;
		diedai();
	}
	return 0;
}

Results:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值