文数(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;
}

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

被折叠的 条评论
为什么被折叠?



