Codeforces 625D Finals in arithmetic(Codeforces Round #342 (Div. 2) D) 题解

题目链接: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;
}


代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值