高精度模板_C++

  高精度压位,压9位

  read:读入

  write:输出

  copy:赋值

  change:交换

  empty:清0

  cmp:比较大小,相当于小于号

  plus:加法

  dec:减法

  multy:乘法

  除法实在不会写压位的……QuQ

  1 #include<cstdio>
  2 #include<algorithm>
  3 using namespace std;
  4 typedef long long LL;
  5 const int W=9,N=1000,w[W]={1,10,1e2,1e3,1e4,1e5,1e6,1e7,1e8},Max=1e9;
  6 int c[N];
  7 char s[N*W];
  8 namespace bigint
  9 {
 10     inline void read(int *p)
 11     {
 12         int i,j,k;
 13         for (s[j=1]=getchar();s[j]!=' '&&s[j]!='\n'&&s[j]!=EOF;s[++j]=getchar());
 14         for (i=0,k=W;j>1;*(p+i)+=w[k++]*(s[--j]-'0')) if (k==W) k=0,i++;
 15         *p=i;
 16     }
 17     inline void write(int *p)
 18     {
 19         int i=*p,j;
 20         printf("%d",*(p+*p));
 21         while (--i)
 22         {
 23             for (j=W;--j&&(*(p+i)<w[j]);) putchar('0');
 24             printf("%d",*(p+i));
 25         }
 26     }
 27     inline void copy(int *pa,int *pb)
 28     {
 29         int i;
 30         for (i=0;i<=*pb;i++) *(pa+i)=*(pb+i);
 31     }
 32     inline void change(int *pa,int *pb)
 33     {
 34         int i,t=max(*pa,*pb);
 35         for (i=0;i<=t;i++) swap(*(pa+i),*(pb+i));
 36     }
 37     inline void empty(int *p)
 38     {
 39         int i;
 40         for (i=1;i<=*p;i++) *(p+i)=0;
 41         *p=0;
 42     }
 43     inline bool cmp(int *pa,int *pb)
 44     {
 45         if (*pa==*pb)
 46         {
 47             int i;
 48             for (i=*pa;i;i--)
 49             {
 50                 if (*(pa+i)==*(pb+i)) continue;
 51                 return *(pa+i)<*(pb+i);
 52             }
 53         }
 54         return *pa<*pb;
 55     }
 56     inline void plus(int *p,int *pa,int *pb)
 57     {
 58         int i,t=max(*pa,*pb);
 59         bool x=0;
 60         for (i=1;i<=t;i++)
 61         {
 62             *(p+i)=*(pa+i)+*(pb+i)+x;
 63             if (*(p+i)>=Max)
 64             {
 65                 x=1;
 66                 *(p+i)-=Max;
 67             }
 68             else x=0;
 69         }
 70         *p=t;
 71         if (x) *(p+(++(*p)))=1;
 72     }
 73     inline void dec(int *p,int *pa,int *pb)
 74     {
 75         bool k=0;
 76         int i;
 77         for (i=1;i<=*pa;i++)
 78         {
 79             *(p+i)=*(pa+i)-*(pb+i)-k;
 80             if (*(p+i)<0)
 81             {
 82                 *(p+i)+=Max;
 83                 k=1;
 84             }
 85             else k=0;
 86         }
 87         *p=*pa;
 88         while (*(p+*p)==0) (*p)--;
 89     }
 90     inline void multy(int *p,int *pa,int *pb)
 91     {
 92         LL k;
 93         int i,j;
 94         for (i=1;i<=*pa;i++)
 95             for (j=1;j<=*pb;j++)
 96             {
 97                 k=(LL)(*(pa+i))*(*(pb+j));
 98                 c[i+j-1]=k%Max;
 99                 c[i+j]=k/Max;
100                 c[0]=i+j;
101                 if (k<Max) c[0]--;
102                 plus(p,p,c);
103                 c[i+j-1]=0;
104                 c[i+j]=0;
105             }
106         *p=c[0];
107     }
108 }
109 int main()
110 {
111     
112     return 0;
113 }

 

posted @ 2017-11-07 05:54  Hadilo  阅读(652)  评论(0编辑  收藏  举报