zoukankan      html  css  js  c++  java
  • POJ2389 Bull Math

      1 /*
      2  POJ2389 Bull Math
      3  http://poj.org/problem?id=2389
      4  高精度乘法
      5  *
      6  */
      7 #include <cstring>
      8 #include <cstdio>
      9 #include <algorithm>
     10 using namespace std;
     11 const int Nmax=1000;
     12 struct BigInt
     13 {
     14     int a[Nmax];
     15     int n;
     16     void init() 
     17     {
     18         for(int i=0;i<Nmax;i++)
     19             a[i]=0;
     20     }
     21     BigInt()
     22     {
     23         init();
     24         n=0;
     25     }
     26     BigInt(int _a[],int _n)
     27     {
     28         init();
     29         n=_n;
     30         //for(int i=0;i<Nmax;i++)
     31             //a[i]=0;
     32         for(int i=1;i<=n;i++)
     33             a[i]=_a[i];
     34         maintain();
     35     }
     36     BigInt(char s[])
     37     {
     38         init();
     39         n=strlen(s+1);
     40         for(int i=1;i<=n;i++)
     41             a[i]=s[n-i+1]-'0';
     42         maintain();
     43     }
     44     BigInt(long long  x)
     45     {
     46         init();
     47         n=0;
     48         while(x>0LL)
     49         {
     50             a[++n]=x%10LL;
     51             x/=10LL;
     52         }
     53     }
     54     BigInt(int x)
     55     {
     56         init();
     57         n=0;
     58         while(x>0)
     59         {
     60             a[++n]=x%10;
     61             x/=10;
     62         }
     63     }
     64     void read()
     65     {
     66         init();
     67         n=0;
     68         char c=getchar();
     69         if(c==-1)
     70             return;
     71         while(c==' ' || c=='
    ' )
     72         {
     73             c=getchar();
     74             if(c==-1)
     75                 break;
     76         }
     77         int num[Nmax];
     78         while(c!=' ' && c!='
    ' && c!=-1)
     79         {
     80             num[++n]=c-'0';
     81             c=getchar();
     82         }
     83         for(int i=1;i<=n;i++)
     84             a[i]=num[n-i+1];
     85         maintain();
     86     }
     87     void print()
     88     {
     89         if(n==0)
     90             printf("0");
     91         for(int i=n;i>=1;i--)
     92             printf("%d",a[i]);
     93     }
     94     void maintain()
     95     {
     96         for(int i=1;i<=n;i++)
     97         {
     98             a[i+1]+=a[i]/10;
     99             a[i]%=10;
    100         }
    101         int j=n+1;
    102         while(a[j]!=0)
    103         {
    104             a[j+1]+=a[j]/10;
    105             a[j]%=10;
    106             j++;
    107         }
    108         n=j-1;
    109         while(a[n]==0 && n>1)
    110             n--;
    111     }
    112     friend BigInt operator + (BigInt a,BigInt b)
    113     {
    114         int len=max(a.n,b.n);
    115         BigInt ans;
    116         ans.n=len;
    117         for(int i=1;i<=len;i++)
    118             ans.a[i]=a.a[i]+b.a[i];
    119         ans.maintain();
    120         return ans;
    121     }
    122     //friend BigInt operator - (BigInt a,BigInt b)
    123     //{
    124         //int len=max(a.n,b.n);
    125         //BigInt ans;
    126         //ans.n=len;
    127         //for(int i=1;i<=len;i++)
    128             //ans.a[i]=a.a[i]-b.a[i];
    129         //for(int i=1;i<=len;i++)
    130         //{
    131             //if(ans.a[i]<0)
    132             //{
    133                 //ans.a[i]+=10;
    134                 //a.a[i+1]--;
    135             //}
    136                 //ans.a[i]+=10
    137         //}
    138     //}
    139     friend BigInt operator * (BigInt b,int a)
    140     {
    141         int n=b.n;
    142         BigInt ans;
    143         ans.n=n;
    144         for(int i=1;i<=n;i++)
    145             ans.a[i]=b.a[i]*a;
    146         ans.maintain();
    147         return ans;
    148     }
    149     friend BigInt operator * (int a,BigInt b)
    150     {
    151         int n=b.n;
    152         BigInt ans;
    153         ans.n=n;
    154         for(int i=1;i<=n;i++)
    155             ans.a[i]=b.a[i]*a;
    156         ans.maintain();
    157         return ans;
    158     }
    159     friend BigInt operator * (BigInt a,BigInt b)
    160     {
    161         BigInt ans;
    162         ans.n=a.n+b.n+1;
    163         int k;
    164         for(int i=1;i<=a.n;i++)
    165             for(int j=1;j<=b.n;j++)
    166                 ans.a[j+i-1]+=a.a[i]*b.a[j];   
    167         ans.maintain();
    168         return ans;
    169     }
    170 };
    171 int main()
    172 {
    173     char s[1002];
    174     char s1[1002];
    175     BigInt a,b;
    176     //freopen("test.in","r",stdin);
    177         a.read();
    178         b.read();
    179         (a*b).print();
    180         printf("
    ");
    181     return 0;
    182 }
  • 相关阅读:
    线性dp打鼹鼠
    区间dp(能量项链)
    留言板
    友链
    CodeForces 1270I Xor on Figures
    agc020_d Min Max Repetition
    Codeforces 1270G Subset with Zero Sum
    CodeForecs 1270E Divide Points
    MybatisPlus学习笔记10:公共字段自动填充
    MybatisPlus学习笔记9:自定义全局操作
  • 原文地址:https://www.cnblogs.com/BBBob/p/6626743.html
Copyright © 2011-2022 走看看