【模版】高精度算法

  1 #include<bits/stdc++.h>
  2
  3 using namespace std;
  4
  5 const int power=4;
  6 const int base=1e4;
  7 const int maxn=2e3+5;
  8
  9 struct num{
 10     int a[maxn<<1];
 11
 12     num(){memset(a,0,sizeof(a));}
 13     int &operator [](int x){return a[x];}//重载中括号
 14     num(char *s,int len){
 15         memset(a,0,sizeof(a));
 16
 17         a[0]=(len+power-1)/power;
 18
 19         for(int t=0,w=1,i=len-1;i>=0;w=(w<<1)+(w<<3),--i){
 20             if((len-1-i)%power==0) w=1,++t;
 21             a[t]+=(s[i]^48)*w;//注意+=
 22         }
 23     }
 24     void add(int k) { if (k || a[0]) a[ ++a[0] ] = k; }     //在末尾添加一个数,除法的时候要用到
 25     void re() { reverse(a+1, a+a[0]+1); }
 26     void print(){
 27         printf("%d",a[a[0]]);
 28         for(int i=a[0]-1;i>0;--i) printf("%0*d",power,a[i]);
 29     }
 30 }ans,p,q;
 31
 32 char p1[maxn],q1[maxn];
 33 int lenp,lenq;
 34
 35
 36 num operator +(num &p,num &q){//重载了中括号所以不用const
 37     int cur=0,len=max(p[0],q[0]);
 38     for(int i=1;i<=len;++i){
 39         cur+=i<=p[0]?p[i]:0;
 40         cur+=i<=q[0]?q[i]:0;
 41         p[i]=cur%base;cur/=base;
 42     }
 43     if(cur) p[++len]=cur;
 44     p[0]=len;//注意更新长度
 45     return p;
 46 }
 47
 48 bool operator <(const num &p,const num &q){//比较大小
 49     if(p.a[0]<q.a[0]) return true;
 50     if(p.a[0]>q.a[0]) return false;
 51     for(int i=p.a[0];i>=1;--i){//倒序
 52         if(p.a[i]!=q.a[i]) return p.a[i]<q.a[i];
 53     }
 54     return false;
 55 }
 56
 57 num operator -(num &p,num &q){
 58     int len=max(p.a[0],q.a[0]);
 59     for(int i=1;i<=len;++i){
 60         p.a[i]-=i<=q.a[0]?q.a[i]:0;
 61         if(p.a[i]<0) p.a[i]+=base,p.a[i+1]-=1;//借位
 62     }
 63     while(p.a[0]>1&&p.a[p.a[0]]==0) --p.a[0];
 64     return p;
 65 }
 66
 67 num operator / (num &p,num &q)               //注意const不要冲突
 68 {
 69     num x, y;
 70     for (int i = p.a[0];i >= 1;--i)                       //从最高位开始取数
 71     {
 72         y.add(p.a[i]);             //把数添到末尾(最低位),这时候是高位在前,低位在后
 73         y.re();                    //把数反过来,变为统一的存储方式:低位在前,高位在后
 74         while ( !(y < q) )         //大于等于除数的时候,如果小于的话,其实答案上的该位就是初始的“0”
 75             y = y - q, ++x.a[i];   //看能减几个除数,减几次,答案上该位就加几次。
 76         y.re();                    //将数反过来,为下一次添数做准备
 77     }
 78     x.a[0] = p.a[0];
 79     while (x.a[0] > 0 && !x.a[x.a[0]]) --x.a[0];
 80     return x;
 81 }
 82
 83 num operator *(const num &p,const num &q){
 84     num b;
 85     for(int i=1;i<=p.a[0];++i){
 86         int cur=0;
 87         for(int j=1;j<=q.a[0];++j)
 88             cur+=b.a[i+j-1]+p.a[i]*q.a[j],b.a[i+j-1]=cur%base,cur/=base;
 89         b.a[i+q.a[0]]=cur;
 90     }
 91     b.a[0]=q.a[0]+p.a[0];//得到大致位数
 92     while(b.a[0]>1&&b.a[b.a[0]]==0) --b.a[0];//除去前导0
 93     return b;
 94 }
 95
 96 int main(){
 97
 98     /*
 99     scanf("%s%s",p1,q1);
100     lenp=strlen(p1);lenq=strlen(q1);
101     p=num(p1,lenp);q=num(q1,lenq);
102     ans=p*q;
103     ans.print();
104     return 0;
105     */
106
107
108     scanf("%s%s",p1,q1);
109
110     lenp=strlen(p1);lenq=strlen(q1);
111
112     p=num(p1,lenp);q=num(q1,lenq);
113
114     ans=p+q;
115     ans.print();
116     return 0;
117
118
119
120     /*
121
122     scanf("%s%s",p1,q1);
123     lenp=strlen(p1);lenq=strlen(q1);
124     p=num(p1,lenp),q=num(q1,lenq);
125     if(q<p) ans=p-q;
126     else putchar(‘-‘),ans=q-p;
127     ans.print();
128     return 0;
129
130     */
131
132 }

这个板子比我之前用的许多压位的都要快,就先用这个了。

摘自:https://blog.csdn.net/weixin_44584560/article/details/89405691?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

不确定原作者

原文地址:https://www.cnblogs.com/popodynasty/p/12590833.html

时间: 2024-10-15 18:57:46

【模版】高精度算法的相关文章

c++加法高精度算法

c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过1秒),但是很好理解,很适合新手 高精算法的本质就是把数组编程字符串,然后将字符串像竖式一样加起来: 1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 using namespace std; 5 int main() 6 { 7 char a[

转载:C++之高精度算法

C++之高精度算法 注意:本文转载自http://blog.sina.com.cn/s/blog_4fdb102b010087ng.html,十分感谢原作者:忍者 前言:由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供15~16位的有效数字,即只能精确表达数百万亿的数.因此,在计算

高精度算法

以下标程均为十进制,如改为10n进制可提高n倍速度. 建议不要使用operator对运算符进行重载,虽然用起来很方便,但是NOIP中不一定能用,速度也会慢一些. 高精度数大小比较 function a_dy_b(a,b:arr):boolean; var i:integer; begin i:=a[0]; if a[0]<>b[0] then a_dy_b:=a[0]>b[0] else begin while (a[i]=b[i])and(i>0) do dec(i); a_dy

LeetCode43,一题让你学会高精度算法

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实没什么好说的,以字符串的形式给定两个数字,要求返回这两个数字的乘积.之所以是以字符串的形式给数字是因为这个数字可能会非常大,题目当中给定的范围是110位的数字.对于Python来说这不是问题,但是对于C++和Java等语言来说这么大的数字是无法以int类型存储的,所以必须要使用字符串来接收. 如果你

卡特兰数高精度算法

很多组合题都会用到卡特兰数,增长速度又很快,应该写个高精度尊敬一下~ 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define ML 549 5 using namespace std; 6 int kt[105][550]; 7 int len[105]; 8 int getlen(int ord) 9 { 10 int pos; 11 for(int i=ML;i>=0;i

【个人模板】高精度算法

一.求两个高精度正数的和差积 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXN=1000; 7 char s1[MAXN],s2[MAXN]; 8 int ed1,ed2,n1,n2; 9 int num1[MAXN]; 10 int num2[MAXN]; 11 int a

c++ 高精度算法

包括: 两个高精度正整数加法 两个高精度正整数乘法 两个高精度正整数减法 两个高精度正整数除法 两个高精度正整数求余 两个高精度正整数数求最大公约数 两个高精度正整数数求最小公倍数 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //清除前缀0,如果结果是空字符串则设为0 7 inline void clear(string& a){ 8 while(a.length()>0

[复习]高精度算法

今天又复习了一下高精度(高精度减.加.乘) 仍然用结构体来存储 数据结构: typedef struct HP{ int w[10001]             //储存数据,0下标储存有多少位 }HP: 注意:高精度为了进位需要反着存储 例如:原数             a     123   -int 高精度数          b       3 |2|1 –int[] 加法 先将最大的位数+1,然后按位相加,每次加完进位,最后删除前导0 减法 和高精度加法类似,相当于就是加上一个负数

算法笔记--高精度算法

高精度乘法: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int M=1e3+5; char s1[M],s2[M]; int a[M],b[M],res[M]; int main() { gets(s1); gets(s2); int c=0; for(in