高精度加减乘除

高精度的运算主要依靠动态数组vector和字符串实现对每一位数字的运算.

1.高精度加法

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
vector<int> add(vector<int> A,vector<int> B){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size() || i<B.size();i++){
        if(i<A.size())   t+=A[i];
        if(i<B.size())   t+=B[i];
        C.push_back(t%10);
        t/=10;
   }
    if(t==1)   C.push_back(1);
    return C;
}

int main(){
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-‘0‘);
    for(int i=b.size()-1;i>=0;i--)   B.push_back(b[i]-‘0‘);

    vector<int> C=add(A,B);
   for(int i=C.size()-1;i>=0;i--){
       cout<<C[i];
   }
  return 0;

}

2.高精度减法

#include <iostream>
#include <vector>

using namespace std;
bool cmp(vector<int> A, vector<int> B){
    if (A.size() == B.size()) {
        for (int i = A.size() - 1; i >= 0; i--) {
            if (A[i] != B[i])
                return A[i] > B[i];
            return true;
        }
    } else
        return A.size() > B.size();
}
vector<int> sub(vector<int> A, vector<int> B){
      vector<int> C;
      int t=0;
    int q=0;
      for(int i=0;i<A.size();i++){
        t=A[i]-q;
        if(i<B.size())
            t=t-B[i];
        C.push_back((t+10)%10);
        if(t<0)  q=1;
        else
            q=0;
      }
      while(C.size()>1 && C.back()==0)
          C.pop_back();
      return C;
}

int main(){
    string a,b;
    vector<int> A,B;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-‘0‘);
    for(int i=b.size()-1;i>=0;i--)   B.push_back(b[i]-‘0‘);

    if(cmp(A,B)){
        vector<int> C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--){
            cout<<C[i];
        }
    }
    else{
       cout<<"-";
        vector<int> C=sub(B,A);
        for(int i=C.size()-1;i>=0;i--){
            cout<<C[i];
        }
    }
    return 0;
}

3.高精度乘法

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
vector<int> mul(vector<int> A,int b){
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size() || t!=0;i++){
        if(i<A.size()) t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    return C;
}

int main() {
  ios::sync_with_stdio(false);
  string a;
  int b;
  vector<int> A;
  cin>>a>>b;
  for(int i=a.size()-1;i>=0;i--)    A.push_back(a[i]-‘0‘);

  vector<int> C=mul(A,b);

  for(int i=C.size()-1;i>=0;i--)
      cout<<C[i];

    return 0;
}

4.高精度除法

#include <iostream>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <cstdio>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
vector<int> div(vector<int> A,int b,int &r){
    r=0;
    vector<int> C;
    for(int i=A.size()-1;i>=0;i--){
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());
    while(C.size()>1 && C.back()==0)
        C.pop_back();
    return C;
}
int main() {
  ios::sync_with_stdio(false);
   string a;
   int b;
   vector<int> A;
   cin>>a>>b;
   for(int i=a.size()-1;i>=0;i--)   A.push_back(a[i]-‘0‘);

   int r;
   vector<int> C=div(A,b,r);

   for(int i=C.size()-1;i>=0;i--)
       cout<<C[i];
   cout<<endl<<r;
    return 0;
}

原文地址:https://www.cnblogs.com/lr599909928/p/12221351.html

时间: 2024-11-13 09:18:45

高精度加减乘除的相关文章

c++的正整数高精度加减乘除

数值计算之高精度加减乘除 一.      高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主要思想是把乘法转化为加法进行运算.请先看下面的等式: 12345*4=12345+12345+12345+12345 12345*20=123450*2 12345*24=12345*20+12345*4 l 等式(1)说明,多位数乘一位数,可以直接使用加法完成. l 等式(2)说明,多位数乘形如d

【转】ACM高精度加减乘除模板

#include <iostream> #include <string> using namespace std; inline int compare(string str1, string str2) { if(str1.size() > str2.size()) //长度长的整数大于长度小的整数 return 1; else if(str1.size() < str2.size()) return -1; else return str1.compare(str

高精度加减乘除模板

高精度板子. 我用的是重载运算符. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 struct mega 6 { 7 int num[200005]; 8 int len,val; 9 bool anti; 10 void reset() 11 { 12 len=val=0; 13 anti=false; 14 memset(num,0,sizeof(num)); 15 } 16 fri

C++高精度加减乘除模板

其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> using namespace std; const int maxn = 100010; int a[maxn], b[maxn], res[maxn]; string add(string s1, string s2) { // under condition: s1,s2>=0 // 初始化部分

模版大全

ACM-高精度模板(综合篇) 时间:2015-02-01 20:30:23 阅读:419 评论:0 收藏:0 [点我收藏+] 标签:高精度 在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式. 本文包含 1.高精度加法 2.高精度减法 3.高精度乘法 1)高精度乘高精度的朴素算法 2)高精度乘高精度FFT优化算法 3)高精度乘单精度 4.高精度除法 1)高精度除高精度 2)高精度除单精度 5.高精度取模 1)高精度对高精度取模 2)高精度对单精度取

常用/常考算法总结

转自tangjz的博客... 基础算法 模拟 搜索 广度优先搜索(BFS) 优化:双向BFS 深度优先搜索(DFS) 优化:折半DFS 迭代加深搜索(IDS) 启发式搜索(Astar) 优化:IDAstar 优化:剪枝.位运算 排序 冒泡排序/选择排序 基数排序/桶排序 计数排序 插入排序/希尔排序 快速排序 归并排序/求逆序对数 堆排序 贪心 分治 二分/三分/n分 cdq分治 倍增/ST 离散化 二分答案 快速幂/十进制快速幂 基础数学 数列求和 泰勒展开 矩阵 矩阵乘法 高斯消元 判断线性

ACM-高精度模板(综合篇)

在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式. 本文包含 1.高精度加法 2.高精度减法 3.高精度乘法 1)高精度乘高精度的朴素算法 2)高精度乘高精度FFT优化算法 3)高精度乘单精度 4.高精度除法 1)高精度除高精度 2)高精度除单精度 5.高精度取模 1)高精度对高精度取模 2)高精度对单精度取模 6.高精度阶乘 7.高精度幂 8.高精度GCD 9.高精度进制转换 下面切入正题 1.高精度加法 传入参数约定:传入参数均为string

高精度模板2(带符号压位加减乘除开方封包)

原来的那个模板:http://www.cnblogs.com/iwtwiioi/p/3991331.html 估计已经不用了. 现在我重新封包好了一个,一定很好用QAQ 加减乘除带开方带压位带重载运算符 注意一下符号即可,一定写的时候要手推四种情况!! 然后在重载<的时候,一定要注意同时判断!!!!要不然又错.. struct big { typedef ll INT; static const INT S=100000000; static const int S_n=9; static co

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

高精度加高精度 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] =