题目链接:http://codeforces.com/problemset/problem/625/D
题意:给出一个数n,问是否可以找到一个数a,使得a的翻转为ar,且a+ar=n
解题思路:一位一位模拟加法的逆操作,在不进位的情况下,a+ar的结果一定是对称的
#include <cstdio>
#include <cstring>
using namespace std;
#define N 100010
char st[N];
int a[N],b[N],c[N];
bool check(int s,int t)
{
while(s<=t)
{
if(s==t)
{
if(a[s]&1) return 0;//如果中间的数为基数
else{b[s]=a[s]/2;return 1;}
}
if(a[t]<-1) return 0;//若a[t]<-1,则说明在加法的时候进了两位以上,这是不可能的
if(a[s]>10||(a[s]==10&&a[t]==0)||a[t]==-1){a[t]+=10;a[t-1]--;}//说明加法时t位进了一位,此时还原
if(a[s]>a[t]){a[s]--;a[s+1]+=10;}//说明加法时s+1位进了一位,此时还原
if(a[s]>18||a[t]>18) return 0;//加法时两个数相加最大为18,不可能大于18
if(a[s]==a[t]){b[s]=(a[s]+1)/2;b[t]=a[s]-b[s];}
else return 0;//若不对称则退出
++s;--t;
}
return 1;
}
void print(int s,int t,int k)
{
if(!a[s]){printf("0");return;}//如果得出的数有前导0,则错误
for(int i=s;i<=t;++i) printf("%d",b[i]);
}
void init(int l)
{
for(int i=1;i<=l;++i) a[i]=c[i];
}
int main()
{
scanf("%s",st);
int l=strlen(st);
for(int i=0;i<l;++i) c[i+1]=st[i]-'0';
init(l);
if(check(1,l)) print(1,l,1);
else if((init(l),l>1)&&a[1]==1)//当第一位是有第二位进位来的时
{
a[1]=0;a[2]+=10;
if(check(2,l)) print(2,l,2);
else printf("0");
}
else printf("0");
return 0;
}
代码: