【高精度】高精度乘法

问题 J: 【高精度】高精度乘法

时间限制: 1 Sec  内存限制: 64 MB
提交: 286  解决: 94
[提交] [状态] [讨论版] [命题人:]

题目描述

牢门上的第三道锁,需要使用高精度乘法来破译出相应密码,当然,必须使用“万进制算法”计算两个非负整数A、B的积,其中A和B的位数在10000位以内。

输入

共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在10000以内。

输出

输出一个数,即A和B的乘积。

样例输入

2
3

样例输出

6

#include <iostream>
#include <vector>
#include <string>
using namespace std;
string multi(string num1,string num2){
    string ans="";int len1=num1.size(),len2=num2.size(),add=0;
    vector<long long>tmp(len1+len2-1);
    for(int i=0;i<len1;++i){
        int p1=num1[i]-‘0‘;
        for(int j=0;j<len2;++j){
            int p2=num2[j]-‘0‘;
            tmp[i+j]+=p1*p2;
        }
    }
    for(int i=tmp.size()-1;i>=0;--i){
        int now=tmp[i]+add;
        tmp[i]=now%10;
        add=now/10;
    }
    while(add!=0){
        int now=add%10;
        add/=10;
        tmp.insert(tmp.begin(),now);
    }
    for(auto a:tmp)ans+=to_string(a);
    if(ans.size()>0&&ans[0]==‘0‘)return "0";
    return ans;
}
int main(int argc, char *argv[]) {
    string num1,num2;
    while(cin>>num1>>num2)
    cout<<multi(num1,num2)<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/Rhythm-/p/9348898.html

时间: 2024-08-02 10:37:08

【高精度】高精度乘法的相关文章

hdu 1063 Exponentiation (高精度小数乘法)

//大数继续,额,要吐了. Problem Description Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems. This problem re

高精度之乘法

3117 高精度练习之乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过500位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Output Description 输出A*B的值 样例输入 Sample Input 3 12 样例输出 Sample Output 36 数据范围及提示 Data Size & Hint 两个正

uva 10106 Product(高精度大数乘法)

昨天刚写了个大数加法,今天又来了个大数乘法,其实解法差不多,只不过换成了好多个大数的相加而 已,看别人的算法其实跟我的也差不多,都是这个姿势.wa了一次,竟然忘了考虑0的情况,以后交题之前,都要判 断一下边缘数据,大数据和小数据,要不就是白白被扣时间啊 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; char a[

高精度加法乘法类

/** 如何用: 1.变量声明:可以给初值,如:BigInt ans=100; 可以补给初值(默认为0),如BigInt ans: 2.计算:可以连个BigInt对象相乘,相加:ans+ans*ans; 也可以和整数相乘相加,如:ans+78*ans; */ struct BigInt { const static int mod=10000; const static int DLEN=4; int a[600],len; BigInt() { memset(a,0,sizeof(a)); l

[转]高精度乘法计算

转载自: Daywei 高精度乘法计算 高精度乘法计算基础 1.高精度浮点运算方法 高精度浮点(Floating Point,FP)运算可以转换成整数型运算.由于高精度浮点数可以看成是由整数部分(Integer Part,IP)与小数部分(Decimal Part,DP)的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数(IxI).整数x小数(IxD)和小数x小数(DxD).用表达式表示, 则FP1*FP2=IP1*IP2+(IP1*DP2+IP2*DP1)+DP1*DP2 (1)对于I

高精度运算专题3-乘法运算(The multiplication operation)

这个专题呢,我就来讲讲高精度的乘法,下面是三个计算乘法的函数,第一个函数是char类型的,要对字符串进行数字转换,而第二个是两个int类型的数组,不用转换成数字,第三个则更为优化,用a数组-b数组放回数组a里面 函数1思路:要先把char类型的转换成int类型的数,直接每个数-‘0’就可以实现把char类型的转换成int类型的了. ①记录数组a.数组b的长度,放到第一位 ②每个位相乘,用一个数来记录进位(初值为0),每个位相乘,加上进位,存入c数组的相对应的位置,每次进位要重新赋值 ③最后记得要

HDU 4927 Series 1(高精度+杨辉三角)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4927 解题报告:对于n,结果如下: C(0,n-1) *A[n] - C(1,n-1) * A[n-1] + C(2,n-1) * A[n-2] - C(3,n-1) * A[n-3] ....... C(n-1,n-1) * A[1]; n <= 3000,到了后面二项式会很大,因为要用到高精度的乘法和除法,所以直接用java的大数类写了,简单多了. 1 import java.math.BigI

c++ 高精度算法

包括: 两个高精度正整数加法 两个高精度正整数乘法 两个高精度正整数减法 两个高精度正整数除法 两个高精度正整数求余 两个高精度正整数数求最大公约数 两个高精度正整数数求最小公倍数 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 //清除前缀0,如果结果是空字符串则设为0 7 inline void clear(string& a){ 8 while(a.length()>0

高精度整数计算

        这部分主要是学习一下计算  无法用内置整数类型来保存它的值(即位数多到long long都表示不了)  的整数的加法和乘法         这里使用的方法是首先读入到一个char的数组里,然后初始化转换到int数组里,这样一位就对应数组的一项.  下面这道题是加法计算,思路就是将对应两个数组位置的数与前一位的进位相加 题目描述 实现一个加法器,使其能够输出a+b的值. 输入描述: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出描述: 可能有多组测试数据,对于每组数

高精度算法

以下标程均为十进制,如改为10n进制可提高n倍速度. 建议不要使用operator对运算符进行重载,虽然用起来很方便,但是NOIP中不一定能用,速度也会慢一些. 高精度数大小比较 function a_dy_b(a,b:arr):boolean; var i:integer; begin i:=a[0]; if a[0]<>b[0] then a_dy_b:=a[0]>b[0] else begin while (a[i]=b[i])and(i>0) do dec(i); a_dy