您的位置:首页 > 其它

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

2017-02-15 14:42 555 查看

题目链接

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 大数