这是一道高精度,又称为大数题。题目的大意是: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; }