高精度加减乘除(C++)

高精度加减乘除(C++),第1张

高精度运算
  • 高精度+高精度
  • 高精度-高精度
  • 高精度*低精度
  • 高精度/低精度

高精度+高精度

实际上高精度就是说参与运算的数据和运算结果的范围,超出标准数据类型能表示的数据大小范围的运算。这个时候,如果要得到正确的计算结果,显然不能依靠普通方法实现了,需要使用高精度的计算了。
重点:
1.使用字符来存储数据
2.将字符串从后向前存,因为加法可能有进位,数组在末尾是很容易插入数据的

高精度加法题目链接,点击直达

代码如下:

#include
#include
#include
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) C.push_back(1);//若做高位还有进位,则要补1
    return C;
}

int main()
{       
    vector<int> A,B;
    string 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');

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

题目链接,点击直达

代码如下:

#include
#include
#include
using namespace std;

//比较2个数的大小
bool cmp(vector<int>&A, vector<int>&B)
{
    if(A.size() != B.size()) return 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;
}
vector<int> sub(vector<int>&A, vector<int>&B)
{
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size();++i)
    {
        t = A[i] - t;  //A[i] - B[i] - t 
        if(i < B.size()) t -= B[i];
        C.push_back((t+10)%10); //把t < 0,和t >=0合并
        if(t < 0) t = 1;
        else t = 0;
    }
    
   
   while(C.size() > 1 && C.back() == 0) C.pop_back();//去掉前导0

    return C;
   }

int main()
{       
    vector<int> A,B;
    string 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;
    if(cmp(A,B))
    {
          C = sub(A,B);
    }
    else
    {
          C = sub(B,A);
          cout<<"-";
    }


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


高精度*低精度

题目链接,点击直达

代码如下:

#include
#include
#include

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;++i)
    {
        if(i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
 
     while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}
int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> A;
    
    for(int i = a.size()-1;i >= 0;--i) A.push_back(a[i] - '0');
    
    auto C = mul(A,b);
    
    for(int i = C.size()-1;i >= 0;--i) 
    {
        printf("%d",C[i]);
    }
    
    return 0;
}
高精度/低精度

题目链接,点击直达

代码如下:

#include
#include
#include
using namespace std;

vector<int> div(vector<int>&A, int b,int& r)
{
    vector<int> C;
     r = 0; 
    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(); //去掉前置0
     
    return C;
}
int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> A;
    
    for(int i = a.size()-1;i >= 0;--i) A.push_back(a[i] - '0');
    int r;
    auto C = div(A,b,r);
    
    for(int i = C.size()-1;i >= 0;--i) 
    {
        printf("%d",C[i]);
    }
    cout<<endl<<r<<endl;
    
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1296127.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-10
下一篇2022-06-10

发表评论

登录后才能评论

评论列表(0条)

    保存