【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=2656
【题意】
计算大数递推式
【思路】
高精度
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 6 const int maxn = 105; 7 const int base = 1e4; 8 9 struct Bign { 10 int len,N[maxn]; 11 int& operator[](const int& i){ 12 return N[i]; 13 } 14 void init() { 15 len=1; 16 memset(N,0,sizeof(N)); 17 } 18 }; 19 Bign tmp; char s[maxn]; 20 void read(Bign& A) 21 { 22 A.init(),tmp.init(); 23 scanf("%s",s+1); 24 int i,j; 25 tmp.len=strlen(s+1); 26 for(int i=1;i<=tmp.len;i++) 27 tmp[i]=s[tmp.len+1-i]-'0'; 28 A.len=(tmp.len-1)/4 +1; 29 for(i=1;i<=A.len;i++) { 30 for(j=1;j<=4;j++) 31 A[i]=A[i]*10+tmp[(i-1)*4+(5-j)]; 32 } 33 } 34 void print(Bign A) 35 { 36 printf("%d",A[A.len]); 37 for(int i=A.len-1;i;i--) 38 printf("%04d",A[i]); 39 puts(""); 40 } 41 Bign operator + (Bign A,Bign B) 42 { 43 A.len=max(B.len,A.len); 44 for(int i=1;i<=A.len;i++) { 45 A[i]+=B[i]; 46 A[i+1]+=A[i]/base; 47 A[i]%=base; 48 } 49 while(A[A.len+1]) A.len++; 50 return A; 51 } 52 Bign operator + (Bign A,int x) 53 { 54 Bign B; B.init(); B[1]=x; 55 return A+B; 56 } 57 Bign operator / (Bign A,int p) 58 { 59 for(int i=1;i<=A.len;i++) { 60 if(A[i]&1) A[i-1]+=base/p; 61 A[i]/=p; 62 } 63 while(!A[A.len]&&A.len) A.len--; 64 return A; 65 } 66 67 Bign p,q,n; 68 69 void F(Bign x) 70 { 71 if(x.len==1 && x[1]==1) { 72 p=x; q.init(); return ; 73 } 74 F((x+1)/2); 75 if(x[1]&1) p=p+q; 76 else q=p+q; 77 } 78 79 int main() 80 { 81 int T; scanf("%d",&T); 82 while(T--) { 83 p.init(),q.init(); 84 read(n); 85 F(n); 86 print(p); 87 } 88 return 0; 89 }
Ps:每次做高精度都会涨姿势 >_<