回文数(Noip1999)题解

该博客介绍了如何解决NOIP1999年竞赛中关于回文数的算法问题。内容涉及如何判断一个数是否为回文数,以及通过多次加法操作得到回文数的最小步骤。文章给出了具体的输入输出样例,并提供了AC代码实现。

文数(Noip1999)


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 13507     通过数: 5503

【题目描述】

若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。

【输入】

给定一个N(2<N<=10或N=16)进制数M。

【输出】

最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。

【输入样例】

9 87

【输出样例】

6

AC Code

#include<iostream>
#include<cstring>
//#include<cstdio>
int a[100];
int l;
using namespace std;
bool huiwen()
{
	for(int i=0;i<l/2;i++)
	{
		if(a[i]!=a[l-i-1])
		    return false;
	}
	return true;
}
int main()
{
	int n;
	char s[100];
    cin>>n>>s;
    l=strlen(s);
    for(int i=0;i<l;i++)
    {
    	if(s[i]>='0' && s[i]<='9')a[i]=s[l-i-1]-'0';
    	else a[i]=s[l-i-1]-'A'+10;
	}
    for(int i=1;;i++)
    {
    	if(i>30)
    	{
    		cout<<"Impossible";
    		break;
		}
		
		if(huiwen())
		{
			cout<<i;
			break;
		}
		else
		{
			cout<<i<<"  ";
			for(int ii=0;ii<l;ii++)
				a[ii]*=2;
	        int k=0;
	        while(k<=l)
	        {
	        	if(a[k]>=n)
	        	{
	        		if(k==l-1)l++;
	        		int jin=a[k]/n;
	        		a[k+1]+=jin;
	        		a[k]=a[k]%n;
				}
				k++;
			}
			for(int i=0;i<l;i++)
			cout<<a[i];
			cout<<endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

感谢有你陪伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值