首页 > 其他分享 >高精度四则运算

高精度四则运算

时间:2023-01-18 21:22:06浏览次数:40  
标签:高精度 int 四则运算 back vector push include size

算法学习的第三天


算法学习之高精度四则运算

高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。

 

1、高精度存储

我们使用数组来存储高精度数字,并且采用倒序的方法,如下图。

计算过程中常常涉及到进位,如果把高位放在第一位要频繁的移动,所以我们采用倒序的方法将数字存储在数组里面。

 

 

2、 高精度加法

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 vector<int> add( vector<int> &A,vector<int> &B ) //引入两个vector (使用vector是因为vector自带size函数,不用另创建数组存储数组大小)
 8 {
 9     vector<int> C; // C为计算结果
10     
11     if(A.size() < B.size()) return add(B,A); //如果A的长度小于B的长度 就swap一下。
12     
13     int t = 0;//引用进位
14     for(int i = 0 ; i < A.size(); i++) // A.size()一定大于B.size()
15     {
16         t += A[i];
17         if(i < B.size())  t += B[i];// A.size()一定小于B.size()
18         C.push_back(t % 10); //C为t进位的余数
19         t /= 10; //t当前为整数
20     }
21     if (t) C.push_back(1); //如果循环完毕t仍为1,那么C最高位再进1
22     return C;
23 }
24 
25 int main()
26 {
27     string a,b;
28     vector<int> A,B;
29     
30     cin >> a >> b; // 输入两个做高精度加法的数字
31     for(int i = a.size() -1 ; i >=0 ;i--) A.push_back(a[i] - '0'); //将a倒序存入vectorA中
32     for(int i = b.size() -1 ; i >=0 ;i--) B.push_back(b[i] - '0'); //将b倒叙存入vectorB中
33     
34     auto C = add(A,B); //auto 可以写成vector<int> add(A,B)引用上面写的函数
35     
36     for(int i = C.size() -1 ; i >= 0 ;i--) printf("%d",C[i]); //逐位输出并拼接
37     return 0;
38 }

 

 

3、高精度减法

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 vector<int> mul(vector<int>&A,int B)
 8 {
 9 vector<int> C;
10 
11 int t = 0;
12 for(int i = 0 ;i < A.size() || t ; i++) // i 小于A的个数或者t的大小
13 {
14 if(i < A.size()) t += A[i] *B; //模拟乘法运算
15 C.push_back( t % 10); //保留结果
16 t /= 10; //中间数减去结果,只保留进位
17 }
18 return C;
19 }
20 
21 int main()
22 {
23 string a;
24 int b ;
25 vector<int> A,C;
26 cin >> a >>b;
27 for(int i = a.size() - 1; i >= 0 ;i --) A.push_back(a[i] - '0');
28 
29 //防止存在前导0的情况
30 if(b) C=mul(A,b); //如果b不为0,就做乘法运算
31 else C.push_back(0); //如果b为0,则结果为0
32 
33 for(int i = C.size() - 1; i >= 0 ;i --) printf("%d",C[i]);
34 return 0;
35 
36 }

 4、高精度乘法

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 vector<int> mul(vector<int>&A,int B) //引入高精度A和低精度B
 8 {
 9 vector<int> C;
10 
11 int t = 0; //进位
12 for(int i = 0 ;i < A.size() || t ; i++) // i 小于A的个数或者t的大小就继续
13 {
14 if(i < A.size()) t += A[i] *B; //模拟乘法运算
15 
16 C.push_back( t % 10); //保留运算结果
17 t /= 10; //中间数减去结果,只保留进位
18 }
19 return C;
20 }
21 
22 int main()
23 {
24 string a;
25 int b ;
26 vector<int> A,C; //提前定义 C
27 
28 cin >> a >>b;
29 for(int i = a.size() - 1; i >= 0 ;i --) A.push_back(a[i] - '0');
30 
31 //防止存在前导0的情况
32 if(b) C=mul(A,b); //如果b不为0,就做乘法运算
33 else C.push_back(0); //如果b为0,则结果为0
34 
35 for(int i = C.size() - 1; i >= 0 ;i --) printf("%d",C[i]);
36 return 0;
37 
38 }

 5、高精度除法

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 vector<int> div(vector<int> &A , int b ,int &r) //A是除数 b是被除数 r是余数  加&是引用 引用速度会更快一点,不加速度会慢一点
 9 {
10     vector<int> C; //定义商
11     r= 0 ; //刚开始余数定义为0
12     for(int i = A.size() - 1; i >= 0 ;i--) //倒着读入
13     {
14         r = r * 10 + A[i]; //模拟除法运算结果 每做一次除法,都要把余数向前一位,把应作除的位数直接拉下来
15         C.push_back(r / b); //存入计算结果
16         r %= b;
17     }
18     reverse(C.begin(),C.end()); //倒着计算完后反转一下 如果不理解的可以试着注释一下再运行
19     while(C.size() > 1 && C.back() == 0) C.pop_back(); //删除前导0
20     return C;
21 }
22 int main()
23 {
24     string a;
25     int b;
26     vector<int> A,C;
27     
28     cin >>a >>b;
29     for(int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
30     
31     int r ;
32     C = div(A,b,r);
33     for(int i = C.size() - 1; i >= 0; i--) printf("%d",C[i]); //输出商
34     cout << endl << r; //输出余数
35     return 0;
36 }

 

标签:高精度,int,四则运算,back,vector,push,include,size
From: https://www.cnblogs.com/litershry/p/17011901.html

相关文章

  • C/C++四则运算表达式的求值系统[2023-01-18]
    C/C++四则运算表达式的求值系统[2023-01-18]四则运算表达式的求值系统设计(四选一选做部分)(1)结合基本操作,建立运算表达式的二叉树,输出树的前中后序遍历的结果,例如[(31-23)......
  • [简单DP+高精度]围墙重建
    题目描述为了给同学们营造一个良好的学习环境和方便学校的管理,市政府准备对小W就读的学校进行重新规划,占地面积将再次扩大。学校通过领导会议决定,重建学校的围墙。由......
  • 模拟与高精度算法
    模拟模拟就是用计算机来模拟题目中要求的操作。模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时......
  • SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图
    工程图是传达您设计意图的重要文档,您设计的产品越复杂,越需要详细注释说明。SOLIDWORKS2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图,并且扩展新......
  • 四则运算——todo,自己写一遍
    四则运算表达式 转载请注明链接:http://www.cnblogs.com/heyonggang/p/3359565.html 代码实现:https://www.cnblogs.com/oucbl/p/12556192.html......
  • 大数的高精度算法
    高精度加法:#include<bits/stdc++.h>usingnamespacestd;stringadd(string&a,string&b){stringc;intt=0;if(a.length()<b.length())returnadd......
  • 高精度sleep
    voidmSleep(intmDelay)//毫秒数{mDelay*=1000;//转换成微秒LARGE_INTEGERt1,t2,freq;QueryPerformanceFrequency(&freq);QueryPerformanc......
  • 高精度+前缀和+差分
    高精度+前缀和+差分高精度高精度加法大整数存储:将数字存到数组里,第一个位置存个位,第二个位置存十位......从\(A_0+B_0\)开始算起,算个位,满十进一易错点:将数字存在......
  • 牛客训练(BIT+高精度)
    又是这类用BIT辅助计数的题。。这个显然满足要求的区间比不满足的要多太多,所以变成求不满足的。。。然后要先求总方案数,为这个不是很想在化了,反正O(n)求也可以的。。然后求......
  • 高精度运算
    高精度运算众所周知,c++有一种变量叫int_64……谁还用高精度呢好吧NOI与CSP貌似不支持int_64的样子完结撒花高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超......