poj 3508 Hide That Number(模拟大数减法)

3 篇文章 0 订阅
1 篇文章 0 订阅

题目链接

http://poj.org/problem?id=3508

题意:

给出一个数字,这个数字的前几位被擦去了,求能否得到一个x,让x*10+x等于这个数字原来的样子

题解:

被擦去的几位只可能是1-10这10个数字,用99,999之类的数举个例子就可以了,然后仔细观察这题发现有个规律:
a b c 0
a b c
———- (a>0)
b c c
a d
因此,能求到x的情况下,最后的x首位必然不能为0,其他位如果减去后一位数字后小于0向前一位借1即可

注意点

输出的char数组要在最后一位输入一个“\0”

AC代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

char num[1000010];

int main()
{
    int cnt = 1;
    while(scanf("%s", num))
    {
        //cout << num <<endl;
        int len = strlen(num);
        char ans[1000010];
        //cout << len << endl;
        if(strcmp(num, "0") == 0)break;
        ans[len-1] = num[len-1];
        int sigh = 0;
        int number = num[len-1];
        for(int i = len - 2; i >= 0; i--)
        {
            number = num[i] - number + sigh;
            if(number < 0)
            {
                ans[i] = number + 10 + '0';
                sigh = -1;
            }
            else
            {
                ans[i] = number + '0' ;
                sigh = 0;
            }
            number = ans[i];
        }
        ans[len] = '\0';
        if (ans[0] != '0')
            printf("%d. %s\n",cnt++,ans);
        else
            printf("%d. IMPOSSIBLE\n",cnt++);

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值