杭电1592

这是一道高精度,又称为大数题。题目的大意是:Gardon 有一大把糖,遇到一个人就给那个人Gardon 所有糖的一般加上一个一半的糖(就是一颗糖的一半),最后遇到Angel了。糖给出后,自己没有了,问最开始有多少糖?我们粗略看几个就会发现原来答案是2^(n+1)-1,n是题目中的数字。当然n很大,直接用数字来做是不够的,这就需要我们用高精度方法来做,有以下两种思路:

1.我们用字符串来做,这就是字符串的乘法,如果你有模板就可以直接套用模板,比较简单,这就要求我们平时的基本功很扎实。

2.我们用数组来做这道题,这里的数组是int型的,虽然题中有一半,但是上面说了答案是2^(n+1)这就不需要担心什么了。

因为方法1比较适合套模板,这里用不讲了,具体的模板百度上有,这里就不多说了,简单说说方法二吧。

方法二的思路就是将答案的数字每一位用一个数组组员来保存,比如说n=3时,答案是15,那就是a[1]=1,a[0]=5,最后输出,a[1],a[0]即可,那么设计怎么设计呢?设计的话,我想就是你将现有的数组元素所有的都乘以2,然后设计一个m表示进位的数字,最后单独讨论一下最高位的进位情况。

具体的设计下面有一个代码供参考:

#include<iostream>
using namespace std;
#include<cstdlib>
const int Max=500;
int a[Max];
int main()
{
   int N;
   int i,j,k;
   int m;
   while(cin>>N)
   {
       k=0;
       a[0]=1;
      for(i=1;i<=N;i++)
      {
          m=0;
         for(j=0;j<=k;j++)
         {
             if(j==0)
             a[j]=(int)(((double)a[j]+0.5)*2)+m;
             else a[j]=a[j]*2+m;
             m=a[j]/10;
             a[j]=a[j]%10;//这里是摸上10,如果是100,1000等的还有额外要注意的,这个这里不说以后大家碰到就会知道。
         }
         if(m!=0)
         {
             k++;
             a[k]=m;
         }
      }
      for(i=k;i>=0;i--)//注意是从后往前输出。
          printf("%d",a[i]);
      cout<<endl;
   }
   return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值