首页 > 其他分享 >【模版】高精度乘法 (A*B problem)

【模版】高精度乘法 (A*B problem)

时间:2023-12-25 11:36:47浏览次数:25  
标签:10 int 模版 back -- vector problem 乘法 size

和A+B problem类似 ,不多说,直接看代码和注释就好啦!ww

感觉这东西只要有个概念就行了...就是在练模拟?www其他语言似乎有大数加减乘除?

 

这样的高精度算法时间复杂度O(n2),n是数字位数,如果位数过大还是很慢。可以利用快速傅里叶变换的方式加速高精度乘法。(虽然都是我连傅里叶级数都没学)

1.大数乘小数

#include <iostream>
#include <vector>

using namespace std;

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

    int t = 0;
    for (int i = 0; i < A.size(); i ++) {
        t += A[i] * b;       // t + A[i] * b = 7218
        C.push_back(t % 10); // 只取个位 8
        t /= 10;             // 721 看作 进位
    }

    while (t) {            // 处理最后剩余的 t
        C.push_back(t % 10);
        t /= 10;
    }

    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');

    auto C = mul(A, b);

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

    return 0;
}

 

2.高精度乘低精度

#include <iostream>
#include <vector>

using namespace std;

vector<int> mul(vector<int> &A, vector<int> &B) {
    vector<int> C(A.size() + B.size() + 7, 0); // 初始化为 0,C的size可以大一点

    for (int i = 0; i < A.size(); i++)
        for (int j = 0; j < B.size(); j++)
            C[i + j] += A[i] * B[j];

    int t = 0;
    for (int i = 0; i < C.size(); i++) { // i = C.size() - 1时 t 一定小于 10
        t += C[i];
        C[i] = t % 10;
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back(); // 必须要去前导 0,因为最高位很可能是 0
    return C;
}

int main() {
    string a, b;
    cin >> a >> b; // a = "1222323", b = "2323423423"

    vector<int> 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 = mul(A, B);

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

    return 0;
}

 图解

标签:10,int,模版,back,--,vector,problem,乘法,size
From: https://www.cnblogs.com/Yukie/p/17925749.html

相关文章

  • 【模版】高精度加法
    原理模拟小学的列竖式计算,因为有些数字的大小在C++没法用基本数据类型存下,故需要高精度算法。高精度计算一般用到数组。把输入的数字倒着存就可以实现竖式计算里面向右对齐。最后再判断进位,输出时最高位特判即可。#include<iostream>usingnamespacestd;constintN=100......
  • 矩阵乘法和矩阵快速幂
    1机房今天晚上不知道为啥把洛谷也关了,AC自动机没题做了,教练您做的好啊那么就冲一个矩阵乘法和快速幂吧,开了提高OJ之后还有几道需要矩阵乘法的AC自动机没写,后面再冲一下状压虽然已经冲过了矩阵矩阵思想来源于线性方程组如方程组\[\begin{equation}\begin{cases}7x_1+8x_2+9x......
  • CodeForces 1909F2 Small Permutation Problem (Hard Version)
    洛谷传送门CF传送门感觉这个题还是挺不错的。考虑F1。考察\(a_i\)差分后的意义,发现\(a_i-a_{i-1}\)就是\((\sum\limits_{j=1}^{i-1}[p_j=i])+p_i\lei\)。考虑将其转化为棋盘问题。在\((i,p_i)\)放一个车,那么\(a_i-a_{i-1}\)就是\((1,i)\sim......
  • kaggle Open Problems – Single-Cell Perturbations 1st & 2nd place solution summa
    Leaderboard:https://www.kaggle.com/competitions/open-problems-single-cell-perturbations/leaderboard2ndSolution:https://www.kaggle.com/competitions/open-problems-single-cell-perturbations/discussion/458738Code:https://github.com/Eliorkalfon/single_ce......
  • [问题记录] C# 使用NPOI操作Excel模版写入数据 - 生成文件打开时提示 "发现 XXX.xlsx
    解决方案:1.先确保原来的模版文件打开是正常的,没有提示要恢复2.用Office打开这个模版文件,另存为一个文件。用这个文件来作为模版使用。 问题描述:使用C#NPOI操作Excel模版(模版用office打开是正常的),写入数据,导出的文件打开时提示是否尝试恢复,点击“是”后,发现Excel内......
  • 【模版】差分
    问题引入:洛谷P2367班上一共n个学生,语文老师需要对成绩进行p次修改,每次修改需要给第x个学生到第y个学生每个人增加z分,语文老师想知道修改成绩后的最低分。对于$40\%$的数据,有$n\le10^3$。对于$60\%$的数据,有$n\le10^4$。对于$80\%$的数据,有$n\le10^5$。对于......
  • 乘法加法和代数计算如何算的快,准
    进位尽量用脑子来记忆,因为每一次进位只保存一个即可.进位跟下一个加完之后就更新了.所以记忆不难,多训练即可.举一个例子:135*87首先写下135  8775=35.所以脑子记住进位3,写下5.然后37=21,所以我们写上4,脑子记住2.1*7=7所以我们写下9就完事了.少写......
  • 【模版】前缀和
    问题引入:【洛谷P8218】##题目描述给定$n$个正整数组成的数列$a_1,a_2,\cdots,a_n$和$m$个区间$[l_i,r_i]$,分别求这$m$个区间的区间和。对于所有测试数据,$n,m\le10^5,a_i\le10^4$ 最朴素的想法,就是对于每次询问,我们都用for循环进行$[l_i,r_i]$区间的求和,不难......
  • P5091 【模版】扩展欧拉定理
    求\(a^b\bmodm,b\le10^{200000}\)。首先引入三种可以通过取模缩小幂指数的方法。费马小定理:当\(a,p\in\mathbb{Z},\spacep\)为质数且\(p\nmida\)时,\(a^{p-1}\equiv1(\bmod\spacep)\),所以有\(a^b\equiva^{b\bmod(p-1)}(\bmod\spacep)\);欧拉定理:当\(a,m\in\m......
  • 【模版】冒泡排序
    刚学C++时书上就会写这个qwq属于最简单的排序算法惹。算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对......