hdu 4608 I-number(13多校#1 ,1009)
题目地址: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(); } } }