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();

   }

   }
}




posted @ 2013-07-25 02:54  814jingqi  阅读(197)  评论(0编辑  收藏  举报