转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1305340420
变种的大数斐波那契数列
水题,直接加就可以了,循环使用4个大数数组a,b,c,ans存放最新的和值,循环25次后的ans就是A99的值
1 //Memory Time
2 //216K 32MS
3
4 #include<iostream>
5 #include<string>
6 using namespace std;
7
8 const int size=1000; //大数位数
9
10 void add(char* aa,char* bb,char* cc,char* ans)
11 {
12 int a[size+1]={0};
13 int b[size+1]={0};
14 int c[size+1]={0};
15 int pa=0,pb=0,pc=0;
16
17 int lena=strlen(aa);
18 int lenb=strlen(bb);
19 int lenc=strlen(cc);
20
21 /*倒序*/
22
23 for(int i=lena-1;i>=0;i--)
24 a[pa++]=aa[i]-'0';
25 for(int j=lenb-1;j>=0;j--)
26 b[pb++]=bb[j]-'0';
27 for(int k=lenc-1;k>=0;k--)
28 c[pc++]=cc[k]-'0';
29
30 int len=lena>lenb?lena:lenb;
31 len=len>lenc?len:lenc;
32 char* d=new char[len+2]; //倒序的ans
33
34 int w=0; //低位到高位的进位
35 for(int x=0;x<=len;x++) //'='为了处理最高位的进位
36 {
37 int temp=a[x]+b[x]+c[x]+w;
38 d[x]=temp%10+'0';
39 w=temp/10;
40 }
41
42 bool flag=false;
43 bool sign=false; //标记ans是否为全0
44 for(w=0;len>=0;len--) //w和len均作指针使用,已无意义
45 {
46 if(!flag && d[len]=='0') //删除数字开头的0
47 continue;
48 else
49 flag=true;
50
51 sign=true;
52 ans[w++]=d[len];
53 }
54 if(sign)
55 ans[w]='\0';
56 else
57 {
58 ans[0]='0';
59 ans[1]='\0';
60 }
61
62 delete d;
63 return;
64 }
65
66 char a[size+1];
67 char b[size+1];
68 char c[size+1];
69 char ans[size+1];
70 int main(void)
71 {
72 while(cin>>a>>b>>c)
73 {
74 for(int i=1;i<=25;i++)
75 {
76 add(a,b,c,ans);
77 add(b,c,ans,a);
78 add(c,ans,a,b);
79 add(ans,a,b,c);
80 }
81 cout<<ans<<endl; //循环25次后,ans刚好是第99个数的值
82 }
83 return 0;
84 }