版本一: #include <iostream> #include <string> using namespace std; string add(string s1,string s2) { if(s1==""&&s2=="") return "0"; if(s1=="") return s2; if(s2=="") return s1; int j,l,la,lb; string max,min; max=s1;min=s2; if(s1.length()<s2.length()) {max=s2;min=s1;} la=max.size();lb=min.size(); l=la-1; for(j=lb-1;j>=0;j--) max[l--] += min[j]-'0'; for(j=la-1;j>=1;j--) if(max[j]>'9'){max[j]-=10;max[j-1]++;} if(max[0]>'9') {max[0]-=10;max='1'+max;} return max; } int main() { string f[1001]; f[1]=f[2]="1"; for(int i=3;i<=1000;i++) f[i]=add(f[i-1],f[i-2]); int n,d; while(cin>>n) { while(n--) { cin>>d; cout<<f[d]<<endl; } } return 1; } 版本二: #include<iostream> #include<string.h> using namespace std; int a[1005][220]; int main() { int j,i,k,l,t,n,m,flag; memset(a,0,sizeof(a)); a[1][0] = 1; a[2][0] = 1; for(i=3;i<=1000;i++) for(j=0;j<220;j++) { a[i][j] += a[i-1][j]+a[i-2][j]; // if(a[i][j] > 9) { a[i][j] = a[i][j] % 10; //进位 a[i][j+1]+=1; } } //----------------------------------------------------------------- scanf("%d",&n) != EOF; while(n--) { scanf("%d",&m); //m为要求位 //----------------------------output: for(j=220-1 ; j>=0 ;j--) //找出最高位 if(a[m][j] != 0) { flag = j; break; } for(j=flag ;j>=0;j--) printf("%d",a[m][j]); printf("/n"); } return 0; }