题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4608
题目分析: 大整数,可以考虑java BigInteger(好像tle?) 这个题的思路是逐步调整,构造一个例子,得到一个比较小的范围,然后暴力就可以了。
我们首先把这个整数加到末尾是0,进位完成以后,取出除了最后一位,每一位求和,看mod10 余数多少,不管是多少,直接用10-这个数(如果得到10改成0),加到最后一位肯定不会进位,构造完成。这样会发现我们要找的数和原来的数之间的差距不会超过18,然后一一暴力就可以。
注意要点:1如果这个数不行,还有恢复数组原来的状态 (recover()干的事情)
2 a[i++]=c[i] ,给最高位进位的空间。
代码:
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
char c[100010];
int a[100010];
int n;
void deal()
{
for(int i=n;i>=1;i--)
if(a[i]>9)
{
a[i]-=10;
a[i-1]++;
}
}
bool right()
{
int sum=0;
for(int i=n;i>=0;i--)
sum+=a[i];
if(sum%10==0) return 1;
else return 0;
}
void recover()
{
for(int i=0;i<n;i++)
a[i+1]=c[i]-'0';
a[0]=0;
}
int main()
{
int size;
cin>>size;
for(int l=0;l<size;l++)
{
cin>>c;
n=strlen(c);
recover();
for(int i=1;i<=20;i++)
{
a[n]+=i;
if(a[n]>9) deal();
if(right())
{
if(a[0]==1) cout<<1;
for(int i=1;i<=n;i++)
cout<<a[i];
cout<<endl;
break;
}
else recover();
}
}
}