zoukankan      html  css  js  c++  java
  • C++ 高精度加法及模板

    高精度加法

    适用于两个正整数相加,且int和long long 存不下的情况下,用代码模拟两个数相加过程,用vector 存值,实质上就是用vector模拟计算过程,达到数字范围远远高于long long 时的加法操作(本文为1e6)

    先上代码:

    #pragma GCC optimize(2)
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <sstream>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <unordered_map>
    #include <unordered_set>
    #define pm make_pair
    using namespace std;
    
    typedef long long ll;
    typedef pair<int, int> pii;
    const int N = 1e6 + 50;
    const int mod = 1e9 + 7;
    const int inf = 0x3f3f3f3f;
    const double eps = 1e-8;
    vector<int > A, B;
    
    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);//如果最后一位要进位直接push_back()即可
    	return c;
    }
    
    int main()
    {
    	string a, b;
    	cin >> a >> b;
    	for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] ^ 48);
    	for (int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] ^ 48);
    	auto c = add(A, B);//逆序存,地位在前,倒着模拟
    	for (int i = c.size() - 1; i >= 0; i --) cout << c[i];//逆序输出
    	cout << endl;
    	return 0;
    }
    

    详解:

    sting a, b; 两数之大,long long 存不下,固用string暂时存一下,再转移到vector 中,要注意的是,假设存的数是123456789,在vector中的顺序应该为987654321,一个下标对应一位(个十百千万),为什么要这样做,因为好模拟,我们做加法时经常遇到12 + 98 = 110,如果我们按地位到高位存储,就是12 98 然后按照我们的计算规则从后往前模拟,这样模拟完还多了一位,不好弄,如果从前往后模拟,21 89 这样模拟完了之后可以push_back,输出时逆序即可。

    关于模拟:
    设一个 t 来控制进位,假设该位为8 和 9,8 + 9 = 17,那么 t % 10 代表本来的答案,t / 10 = 1,代表要进位,计算时实质上就是t = t + a[i] + b[i],再对每一位进行操作。

  • 相关阅读:
    堆和堆排序
    快速排序
    Sublime Text3汉化好的绿色免安装版使用和破解教程+下载链接
    复杂数据类型(signal)的解读-C语言基础
    C/C++命名规范-C语言基础
    fgets()函数的详解以及使用时需要注意的一些细节-C语言基础
    scanf()函数的详解以及使用时需要注意的一些细节-C语言基础
    getchar()函数的详解以及使用时需要注意的一些细节-C语言基础
    如何用算法把一个十进制数转为十六进制数-C语言基础
    杨辉三角形实现过程详解-C语言基础
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294149.html
Copyright © 2011-2022 走看看