HDOJ 1041 Computer Transformation

本文详细解析了HDOJ1041 Computer Transformation问题,通过使用大数运算解决递推公式计算过程中的数值溢出问题,并分享了调试过程中遇到的挑战及解决方案。

HDOJ 1041 Computer Transformation

http://acm.hdu.edu.cn/showproblem.php?pid=1041

简单的大数应用,但很久没有写大数的题WA了几次

a[i][j+1] = a[i][j] / 10;       //进位

a[i][j] = a[i][j] % 10;

但不是简单的大数A+B,所以进位时要注意 /10;

改过来之后还是WA

于是怀疑自己推的公式不正确

看了下别人的公式

  if( i % 2 == 0 )  times = times * 2 + 1 ;
  else times = times * 2 - 1 ;

换了下公式还是WA

幸好不小心测了n=1的数据,发觉大数操作一个重要的地方漏了.

0的时候要打10出来~~

改了下就AC,不过别人推出来的公式不好控制

我的公式也是对的:

a[i] = a[i-1] +a[i-2]*2;

 

#include <iostream>

using namespace std;

int a[1002][500] = {0};

int main()

{

         int i,j,k,n,m,t;

         a[0][0] = 0;a[1][0] = 0;a[2][0] = 1;a[3][0] = 1;

         for(i=4;i<=1000;i++)

         {  

                   for(j=0;j<500;j++)

        {

            a[i][j] += a[i-1][j] +a[i-2][j]*2;

            if(a[i][j] > 9)

            {

                                     a[i][j+1] = a[i][j] / 10;

                a[i][j] = a[i][j] % 10;        //进位        

            }

        }

         }

         while (scanf("%d",&n)!=EOF)

         {

                   int flag = 0;

                   if (n == 1 || n == 0)

                   {

                            printf("0/n");

                            continue;

                   }

                   for (i=500-1;i>=0;i--)

                   {

                            if (a[n][i] != 0 || flag == 1)

                            {

                                     flag = 1;

                                     printf("%d",a[n][i]);

                            }

                   }

                   printf("/n");

         }

         return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值