http://wikioi.com/problem/1045/
其实就是道模拟题,按题意来就行了,想想哪些地方可以优化
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char a[1000];
int s1[1000];
int s2[1000];
int s[1000];
int m;
int step=0;
int l;
void fz()
{
for(int i=1;i<=l;i++)
{
s2[l-i+1]=s1[i];
}//倒着储存
}
void work()
{
step++;
for(int i=1;i<=l;i++)
{
s[i]=s1[i]+s2[i];
}
for(int i=1;i<=l;i++)//类似高精
{
if(s[i]>=m)//注意精度
{
int w=s[i]/m;
s[i+1]+=w;
s[i]=s[i]%m;
}
}
while(s[l+1]>0)
{
if(s[l+1]>=m)
{
int w=s[l+1]/m;
s[l+2]+=w;
s[l+1]=s[l+1]%m;
}
l++;
}
for(int i=1;i<=l;i++)
{
s1[l-i+1]=s[i];
}
}
bool check()//判断是否为回文数
{
if(step>30)
{
printf("Impossible!\n");
return true;
}
for(int i=1;i<=l;i++)
{
if(s1[i]!=s1[l-i+1])return false;
}
printf("STEP=%d\n",step);
return true;
}
int main()
{
scanf("%d",&m);
scanf("%s",a);
l=strlen(a);
for(int i=0;i<l;i++)
{
if(a[i]-'0'>10)s1[i+1]=a[i]-'A'+10;
else s1[i+1]=a[i]-'0';
}
while(!check())
{
fz();
work();
}
}