[Nowcoder] 大整数相乘(拼多多笔试题)

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:
空格分隔的两个字符串,代表输入的两个大整数
输出描述:
输入的乘积,用字符串表示
输入例子1:
72106547548473106236 982161082972751393
输出例子1:
70820244829634538040848656466105986748

大数乘法问题

简单来说就是把A[i]*B[j]累加放到临时数组的C[i+j]位置。

然后对数组C执行进位加法即可。

剩下的步骤就是字符与数字之间的转换与逆序问题。

参考代码如下:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        int n1 = str1.size(), n2 = str2.size();
        vector<int> v1, v2;
        // 将两个字符串放入数组中并逆序
        for (int i = n1 - 1; i >= 0; --i)
        {
            v1.push_back(str1[i] - ‘0‘);
        }
        for (int i = n2 - 1; i >= 0; --i)
        {
            v2.push_back(str2[i] - ‘0‘);
        }
        // 待处理的临时数组
        vector<int> v(n1 + n2, 0);
        for (int i = 0; i < n1; ++i)
        {
            for (int j = 0; j < n2; ++j)
            {
                v[i + j] += v1[i] * v2[j];
            }
        }
        // 处理数组中的加法进位
        for (int i = 0; i < n1 + n2-1; ++i)
        {
            v[i + 1] += (v[i] / 10);
            v[i] = v[i] % 10;
        }
        string res;
        // 判断最终结果的有效位数
        int m = n1 + n2 - 1;
        if (v[n1 + n2 - 1] == 0)
            m = n1 + n2 - 2;
        // 将结果转换为字符串
        for (int i = m; i >= 0; --i)
        {
            res += (v[i] + ‘0‘);
        }
        cout << res << endl;
    }
    return 0;
}    

原文地址:https://www.cnblogs.com/immjc/p/9420387.html

时间: 2024-10-12 17:17:21

[Nowcoder] 大整数相乘(拼多多笔试题)的相关文章

[Nowcoder] 最大乘积(拼多多笔试题)

给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出描述: 满足条件的最大乘积 输入例子1: 3 4 1 2 输出例子1: 24 求三个数字的最大乘积. 1. 数组全部是正数,最大三个数的乘积 2. 数组全部是负数,最大三个数的乘积 3. 数组有正有负,最大的一个数和最小的两个数的乘积 所以一共需要计算五个值:数组中最大的三个值和最小的两个值 比较最大三个数的乘积和最大一个数与最小两个

求两个大整数相乘的积,数字长度在127个字符之内。

计算两个大整数相乘的结果,数字不是double类型能表示的,数字长度没有限制(最大127位). 方法一:使用java中的大整数处理库函数,java.math.BigInteger,java.math.BigDecimal; 方法二:不利用库函数,自己实现其功能,可以练习自己对待复杂问题的处理能力,提高编程水平. 此代码中利于两者的结合,利于库函数可以看自己编写的代码的正确性. 1.主函数 import java.math.BigDecimal; import java.util.Scanner;

用阿拉伯乘法解决大整数相乘问题

问题 大整数相乘 思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持"无限精度"的整数,一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 5187258157415700236034169791337062

[算法]:分治法-求大整数相乘

#问题大整数相乘 #思路说明 对于大整数计算,一般都要用某种方法转化,否则会溢出.但是python无此担忧了. Python支持**"无限精度"的整数,**一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型. 例如: >>> 2899887676637907866*1788778992788348277389943 51872581574157002360341697913

python写的大整数相乘的方法

输入 72106547548473106236 982161082972751393 两个大整数 输出结果 70820244829634538040848656466105986748 解题思路 首先根据 大整数相乘的原理的基础上,把大整数进行优化拆分,拆分的长度,要考虑语言中整形的长度.这里用的python,其实可以直接乘的,呵呵.我暂定设为了 4,也就是 说 7210 6547 5484 7310 6236 98 2161 0829 7275 1393 然后 逐份相乘,当然千万别忘了结果要补

大整数相乘“分治法”和“循环暴力法”

前言 今天刷到一道很有趣的面试题,感觉很有意思,来分享给大家. 题目描述 有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述:空格分隔的两个字符串,代表输入的两个大整数输出描述:输入的乘积,用字符串表示 示例1 输入72106547548473106236 982161082972751393输出70820244829634538040848656466105986748 思路分析 例如x=1234,y=567 ①将x拆分成两半儿,a =

python实现大整数相乘---格子乘法

以前做ACM的时候,许多人都通过 BigInteger 来实现大数乘法,让我记忆犹新的事2012年的辽宁省赛在大连大学,第一道水题就是大整数乘法,那时还不会java. 大数乘法的实现是基于印度的格子乘法,使用这种方法,计算 m 位数乘以 n 位数只需要创建一个 m+n 位的数组保存结果即可. 今天我们来用python来模拟一下格子算法的运算过程,python来写算法还是很简单的. 下面是从维基百科上爬下来的图片和详细步骤. 第一步:画带斜线的格子,将第一数(58)写在格子顶部,第二数(213)书

链表问题3——大整数相乘

Description 求两个不超过200位的非负整数的积. 解决方法:先考虑大整数存储结构,数组和链表都可以,因为数组使用不熟练,我先考虑链表,做了6小时才写好...也是醉了.下面简单介绍我的思路: 1.考虑链表的数据结构:先思考得知,链表结点要有pre.next指针,所以是双向链表,要设置头尾节点,我是让尾结点指向最后一个结点,头节点为虚结点. 2.链表构造问题:从输入的字符串转换为整型的链表 3.相乘:为了错位相加中运算方便,我将结果倒序表示,头节点后面连结果的最后一位数.一开始结果链表r

大整数相乘问题总结以及Java实现

最近在跟coursera上斯坦福大学的算法专项课,其中开篇提到了两个整数相乘的问题,其中最简单的方法就是模拟我们小学的整数乘法,可想而知这不是比较好的算法,这门课可以说非常棒,带领我们不断探索更优的算法,然后介绍可以通过使用分而治之的思想来解决这个问题.下面对该问题的方法以及实现进行介绍. 问题定义 输入:2个n位的整数x和y 输出:x * y 如求: 1234567891011121314151617181*2019181716151413121110987654 的结果 求解该问题要注意的是