序列- POJ

直接用了自己的模板

#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
#define max(a,b) (a > b ? a : b)
#define min(a,b) (a < b ? a : b)
#define MAXD 1000 + 100
struct Big{
    int  numx[MAXD];
    int  Size;
    int  Sym;
    Big(){
        memset(numx,0,sizeof(numx));
        Size = 1;
        Sym  = 0;
    }
    Big operator =(char t[]){
        Size = strlen(t);
        Sym  = 0;
        for(int i = 0, j = Size - 1; i < Size ; i++, j --)
            numx[i] = t[j] - '0';
    }
    Big operator =(Big t){
        Size = t.Size;
        Sym  = t.Sym;
        for(int i = 0; i < MAXD ; i ++)
            numx[i] = t.numx[i];
    }
    bool operator >(Big t){
        if(Size > t.Size) return true;
        else if(Size < t.Size) return false;
        else{
          for(int i = Size - 1; i >= 0;i--){
              if(numx[i] > t.numx[i]) return true;
              else if(numx[i] < t.numx[i]) return false;
          }
          return false;
        }
    }
    bool operator <(Big t){
        if(Size < t.Size) return true;
        else if(Size > t.Size) return false;
        else{
          for(int i = Size - 1; i >= 0;i--){
              if(numx[i] < t.numx[i]) return true;
              else if(numx[i] > t.numx[i]) return false;
          }
          return false;
        }
    }
    Big operator +(Big t){
        Big ans;
        memset(ans.numx,0,sizeof(ans.numx));
        for(int i = 0; i < max(t.Size,Size); i++){
              ans.numx[i] += numx[i] + t.numx[i];
              if(ans.numx[i] >= 10){
                  ans.numx[i] %= 10;
                  ans.numx[i + 1] ++;
              }
        }
        ans.Size = max(t.Size,Size) + 1;
        return ans;
    }
    Big operator -(Big t){
        Big ans;
        if(*this > t){
            for(int i = 0; i < max(t.Size,Size); i++){
              ans.numx[i] += numx[i] - t.numx[i];
              if(ans.numx[i] < 0){
                  ans.numx[i] += 10;
                  ans.numx[i + 1] --;
              }
            }
        }
        else if(*this < t){
            for(int i = 0; i < max(t.Size,Size); i++){
              ans.numx[i] += t.numx[i] - numx[i];
              if(ans.numx[i] < 0){
                  ans.numx[i] += 10;
                  ans.numx[i + 1] --;
              }
            }
            ans.Sym = 1; /*变为符号*/
        }
        ans.Size = max(t.Size,Size) + 1;
        return ans;
    }
    Big operator *(Big t){
        Big  ans;
        for(int i = 0 ; i < Size; i++)
            for(int j = 0; j < t.Size; j++)
            ans.numx[i + j] = numx[i] * t.numx[j];
        for(int i = 0 ; i < MAXD - 10; i++){
            ans.numx[i + 1] += ans.numx[i] / 10;
            ans.numx[i] %= 10;
        }
        return ans;
    }
    void print(){
        int i ;
        if(Sym) printf("-");
        for(i = MAXD - 10; i >=0 && numx[i] == 0; i--);
        if(i < 0) printf("0");
        else  for( ; i >= 0 ; i--) printf("%d",numx[i]);
        printf("\n");
    }
};
int main(){
    char num1[MAXD],num2[MAXD],num3[MAXD];
    while(scanf("%s%s%s",num1,num2,num3) != EOF){
        Big x;
        x = num1;
        Big y;
        y = num2;
        Big z;
        z = num3;
        int cnt = 99 - 2;
        while(cnt --){
            x = x + y;
            x = x + z;
            Big t;
            t = x;
            x = y;
            y = z;
            z = t;
        }
        z.print();
    }
    return 0;
}


你可能感兴趣的:(序列- POJ)