高精度四则运算

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #include <string>
  6 #include <vector>
  7 #include <map>
  8 #include <set>
  9 #include <queue>
 10 #include <list>
 11 #include <cstdlib>
 12 #include <iterator>
 13 #include <cmath>
 14 #include <iomanip>
 15 #include <bitset>
 16 #include <cctype>
 17
 18 using namespace std;
 19 #define cin_1(a) scanf("%d",&a)
 20 #define cin_2(a,b) scanf("%d%d",&a,&b)
 21 #define cin_3(a,b,c) scanf("%d%d%d",&a,&b,&c)
 22 #define max_2(a,b) a>b?a:b
 23 #define max_3(a,b,c) max_2(max_2(a,b),c)
 24 #define ll long long
 25 #define rint register int
 26 #define mem0(x) memset(x, 0, sizeof(x))
 27 #define mem1(x) memset(x, -1, sizeof(x))
 28 inline int read()///神奇的读优
 29 {
 30     int x=0,f=1;char c=getchar();
 31     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
 32     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
 33     return x*f;
 34 }
 35 const int inf = 0x3f3f3f3f;
 36 const ll inff = 0x3f3f3f3f3f3f3f3f;
 37 //map<ll,ll>mp;
 38 //set<ll>st;
 39 /***********************************************/
 40 bool judge(string str1,string str2)///是否str1小于str2
 41 {
 42     int len1=str1.length();
 43     int len2=str2.length();
 44     if(len1<len2 || (len1==len2 && str1<str2)) return 1;
 45     return 0;
 46 }
 47
 48 string add(string str1,string str2)///高精度加法
 49 {
 50     string str;
 51     vector<int>x,y;
 52     int len1=str1.length();
 53     int len2=str2.length();
 54     int len=max(len1,len2);
 55     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘);
 56     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘);
 57     for(int i=0;i<len;i++)
 58     {
 59         if(i<len1 && i<len2) x[i]+=y[i];
 60         else if(i>=len1 && i<len2) x.push_back(y[i]);
 61     }
 62     for(int i=0;i<len-1;i++)///进位
 63         if(x[i]>=10) { x[i+1]+=x[i]/10; x[i]%=10; }
 64     if(x[len-1]>=10){
 65         x.push_back(x[len-1]/10);
 66         x[len-1]%=10;
 67         len++;
 68     }
 69     for(int i=len-1;i>=0;i--) str+=x[i]+‘0‘;
 70     return str;
 71 }
 72
 73 string sub(string str1,string str2)///高精度减法
 74 {
 75     int f=0;
 76     string str;
 77     vector<int>x,y;
 78     int len1=str1.length();
 79     int len2=str2.length();
 80     if(len1<len2 || (len1==len2 && str1<str2)){swap(str1,str2);swap(len1,len2);f=1;}
 81     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘);
 82     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘);
 83     for(int i=0;i<len2;i++) x[i]-=y[i];
 84     for(int i=0;i<len1-1;i++) if(x[i]<0){x[i+1]--;x[i]+=10;}///进位
 85     while(x[len1-1]==0 && len1>1) len1--;///去前导0
 86     if(f) str+=‘-‘;
 87     for(int i=len1-1;i>=0;i--) str+=‘0‘+x[i];
 88     return str;
 89 }
 90
 91 string mul(string str1,string str2)///高精度乘法
 92 {
 93     string str;
 94     str+=‘0‘;
 95     vector<int>x,y;
 96     int len1=str1.length();
 97     int len2=str2.length();
 98     for(int i=len1-1;i>=0;i--) x.push_back(str1[i]-‘0‘);
 99     for(int i=len2-1;i>=0;i--) y.push_back(str2[i]-‘0‘);
100     for(int i=0;i<len1;i++)
101     {
102         int yy=len2;
103         vector<int>z;
104         for(int j=0;j<len2;j++) z.push_back(x[i]*y[j]);
105         for(int j=0;j<len2-1;j++) if(z[j]>=10) {z[j+1]+=z[j]/10; z[j]%=10; }///进位
106         while(z[len2-1]>=10) { z.push_back(z[len2-1]/10);z[len2-1]%=10;len2++; }
107         for(int k=1;k<=i;k++) z.push_back(0);
108         for(int k=len2-1;k>=0;k--) swap(z[k],z[k+i]);
109         len2+=i;
110         while(z[len2-1]==0 && len2>1) len2--;///去前导0
111         string t;
112         for(int ii=len2-1;ii>=0;ii--) t+=‘0‘+z[ii];
113         str=add(str,t);
114         len2=yy;
115     }
116     return str;
117 }
118
119 string div(string str1,string str2) ///高精度除法 str1/str2
120 {
121     string str,t;
122     int len1=str1.length();
123     int len2=str2.length();
124     for(int i=0;i<len1;i++)
125     {
126         t+=str1[i];
127         string g;
128         for(int k=1;k<=10;k++)///试商
129         {
130             g=‘0‘+k;
131             if(judge(t,mul(g,str2))) ///试商成功
132             {
133                 if(str.length()==0 && k==1) ;
134                 else str+=‘0‘+k-1;///商为 k-1
135                 g=‘0‘+k-1;
136                 t=sub(t,mul(g,str2));
137                 if(t[0]==‘0‘) t="";
138                 break;
139             }
140         }
141     }
142     if(str.length()==0) str+=‘0‘;
143     return str;
144 }
145
146 int main() {
147
148     return 0;
149 }

原文地址:https://www.cnblogs.com/liuyongliu/p/10295707.html

时间: 2024-10-12 21:38:24

高精度四则运算的相关文章

hdu1134 Game of Connections 高精度 四则运算 模板

即卡特兰数. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmath> #include <queue> #include <set> #include <map> #define FOR

Java高精度四则运算(无括号限制)

package cn.skyatom.common; import java.math.BigDecimal; import java.util.regex.Matcher; import java.util.regex.Pattern; /**  * 基础四则运算  *  * @author ZWK  */ public class Arithmetic {     private static String getUUID() {         return java.util.UUID.

高精度模板(含加减乘除四则运算)

高精度加高精度 1 void BigAddBig(char *a, char *b, char *c) 2 { 3 //a表示结果,b,c位加数 4 int a_int[1005] = { 0 }, b_int[1005] = { 0 }, c_int[1005] = { 0 }; 5 int len1, len2, len, i; 6 len1 = strlen(b); 7 len2 = strlen(c); 8 for (i = 0; i < len1; i++) 9 b_int[i] =

大整数四则运算

============ 日后再写!先将设计思想留下 ============= 定义并实现超长整数类double long,要求如下: 64位数据长度,有符号 支持+.-.*./运算 支持+=.-=./=运算 支持cin>>和cout<<操作 首先,我们的运算对象是大整数并且要支持cout<<和cin>>操作,数组和链表是可选择项.在这里我们用数组.数组有int型和char型,选哪个好呢?只能选char型,因为我们的大整数是有符号位的,必须用一个char字

大整数类BIGN的设计与实现 C++高精度模板

首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了一个高精度类,允许大整数的四则运算 这个类利用字符串进行输入输出,并利用数组进行储存与处理,通过模拟四则运算,可以计算很大的整数的加减乘除比大小. 贴上我的代码: #include<string> #include<iostream> #include<iosfwd> #i

算法竞赛之高精度以及部分组合的入门讲解

在算法竞赛之中,有时候一些题目的意思很容易就可以看出来解决步骤,但是数据却不是平常的数据量,而是高精度数据,这时候要是因为高精度的问题而使得这道题失去了AC的机会岂不是会被队友喷死,所以今天就教教大学关于高精度的一些算法吧. 个人对于高精度的算法,感觉就是很原始的小时候学习加减乘除时候的做法.怎么说呢,当然是一位一位进行处理的,可能乘法有一些什么快速乘法的,这个等后面再进行讲解,现在就说说平常自己针对高精度是怎么进行处理的吧. 首先呢,因为是高精度,那么数字的范围不大可能是int乃至__int6

高精度重载运算符

高精度重载运算符模板 struct bign{ //存在性定义 int len, s[2010]; //初始化 bign () {memset(s, 0, sizeof(s)), len = 1;} bign (int num){ *this = num;} bign (char *num) {*this = num;} bign (const char *num){ *this = num;} //重载 = bign operator = (int num) { char s[2010]; s

高精度模板(Big_Int)

你还在为刷题时看到的高精度预警而苦恼吗? 你还在因为高精度难写而放弃宝贵的分数吗? 不用担心!让高精度模板 来帮助你! 目前已知bug: 长度最大值只能开到54724,超过这个值会爆炸(无法调试),目前原因未知 2018.09.07更新: 1.优化了高精乘以低精的速度. 2.输出优化,可使用.output()函数输出.(基于输出挂)@Jesse666 ps:那个长度最大值的bug有可能是栈空间的问题,可以试试更改栈空间有没有效果 2018.09.01更新: 1.鉴于@Jesse666同学的建议,

大整数四则运算(vector)

目录 基础 1. 高精度加法 2. 高精度减法 3. 高精度乘低精度 4. 高精度除以低精度 5. 高精度乘高精度 6. 高精度除以高精度 综合 总结 每逢大整数四则运算,都会怯懦,虽是算法竞赛必会的东西,也零散的学过,简单的总结过,但不成体系的东西心里一直没底. 所以今天消耗了大量的卡路里,啃了几套模板之后终于总结成了一套自己的模板 再也不用担心大整数啦 基础 1. 高精度加法 高精度加法等同于算术加法,做单个的加法运算之后存下进位 A和B都为正整数 vector中下标为0存的是低位(以下都是