大数相乘——模拟乘法的运算规则

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
    void add(int a[], int length1, int b[], int length2);
    char str1[255], str2[255];
    int num1[255] = { 0 }, num2[255] = { 0 };
    int product[255] = { 0 }, temp[255] = {0};//temp用于存放乘法的中间值。比如计算123*3时,temp依次为369,246,123.
    int length1, length2, length;
    int i, j;

    gets(str1);
    gets(str2);
    length1 = strlen(str1);
    length2 = strlen(str2);
    length = length1 > length2 ? length1 : length2;

    //将两个数存入到num[]中
    for (i = 0; i <= length1 - 1; i++)
    {
        num1[i] = str1[i] - ‘0‘;
    }

    for (i = 0; i <= length2 - 1; i++)
    {
        num2[i] = str2[i] - ‘0‘;
    }

    for (i = length2 - 1; i >= 0; i--)
    {
        for (j = length1 - 1; j >= 0; j--)
        {
            temp[j] = temp[j] + num2[i] * num1[j];
            if ((temp[j] >= 10) && (j != 0))
            {
                temp[j - 1] = temp[j] / 10;//表示向前的进位
                temp[j] = temp[j] % 10;
            }
        }
        //计算123*3时,temp值369,246,123需要转换为369,2460,12300之后,再相加。
        //i=length2-1时,temp的长度为length1;
        //i=length2-2时,temp的长度为需转为length1+1;
        //所以temp的长度为length1 + length2 - i - 1。
        add(product, length1 + length2 - i - 2,temp, length1 + length2 - i - 1);
        memset(temp, 0, sizeof(int) * 255);
    }

    for (i=0; i < length1 + length2 - 1; i++)
    {
        printf("%d", product[i]);
    }

    return 0;
}

//函数功能:将大数a和大数b相加,结果存放于a中。length1和length2分别为大数a和大数b的长度。
void add(int a[], int length1,int b[], int length2)
{
    int i, j;
    int num1[255] = { 0 }, num2[255] = { 0 };
    int length;

    length = length1>length2 ? length1 : length2;
    for (i = length - 1, j = length1 - 1; j >= 0; i--, j--)
    {
        num1[i] = a[j];
    }
    for (i = length - 1, j = length2 - 1; j >= 0; i--, j--)
    {
        num2[i] = b[j];
    }

    for (i = length-1; i >= 0; i--)
    {
        num1[i] = num1[i] + num2[i];
        if ((num1[i] >= 10) && (i != 0))
        {
            //此处不能使用num1[i - 1] += 1.因为进位不一定为1.
            //比如999*99时,中间值为[‘0‘,‘89‘,‘9‘,‘1‘]和[‘89‘,‘9‘,‘1‘,‘0‘]。89和9相加后,进位为9.
            num1[i - 1] += num1[i] / 10;//表示进位。
            num1[i] = num1[i] % 10;
        }
    }

    for (i = 0; i < length; i++)
    {
        a[i] = num1[i];
    }
}

大数相乘——模拟乘法的运算规则,布布扣,bubuko.com

时间: 2024-10-05 17:59:11

大数相乘——模拟乘法的运算规则的相关文章

大数相乘-高精度乘法

一.算法简要描述 给定两个数,相乘如何得到高精度的结果,给定的两个数,不确定是不是浮点数,即可能一个数带多位小数,另一个带小数,或者两个数都带多位小数,或都不带小数,针对这些情况,程序应该都要考虑,所谓的高精度其实就是看两个数的小数位有多少,那么其结果的小数位数应该为两数小数位数之和. 二.算法思路 针对上述描述,其实大部分思路首先想到的应该是用字符串来表示这两个数,带小数点和不带小数点最终都可转换成类似于两个大整数相乘的情况,在最后考虑把小数点放到结果的合适位置即可 三.算法代码 /* two

大数相乘

1.算法思路 将大数当做字符串进行处理,也就是将大数用十进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程得到乘法的结果. 乘积是逐位相乘,也就是a[i] * b[j],结果加入到积C的第i+j位,即 最后处理进位即可 例如:A =17 = 1*10 + 7 = (7,1)最后是十进制的幂表示法,幂次是从低位到高位,以下同. B=25 = 2*10 + 5 = (5, 2); C = A * B = (7 * 5, 1 * 5 + 2 * 7, 1 * 2) = (35, 19, 2)

ACM大赛题 【C++大数相乘】

题     目: 大数相乘,我们常常会遇见几百位长的数字之间相乘的编程题,例如在算法中,ACM大赛题中,下面就是大数相乘的详细过程. 思      路: 模拟相乘法 举例说明: 123*789=97047 原理展示: 计算机计算: . C++源代码: 结果展示:

大整数乘法(简单模拟乘法过程)

一.分析 整数的数值超过计算机硬件所能表示的最大值时,那么我们只能借助软件的方法来实现大整数的乘法了. 我们可以使用字符串来模拟大整数的乘法,算法的思想就是使用我们在小学时学过的乘法,一位位相乘,最后计算出结果.如下: 1    2    3 x    1    2 ------------------------ 2 4 6 1 2 3 ------------------------ 1 4 7 6 为了模拟乘法过程,我们需要使用两个字符串变量,一个保存每一步乘积结果,另一个保存最终的结果.

Stanford Algorithms(一): 大数相乘(c++版)

Stanford Algorithms(一): 大数相乘(c++版) 刚不就在中国大学Mooc上参加了陈越老师的数据结构的课程,收获很大.觉得趁热打铁,也把算法的部分也给一块学了吧,就在Coursera上注册了一个斯坦福大学的算法课,课程的量很重,估计要学一个学期吧,慢慢的学,稳扎稳打. 课程里推荐了很多书,我找了一本, 书名就叫Algorithms,作者是S.Dasgupta教授,简单翻看了一下,觉得写的挺不错,就姑且把这本书当做教材了. 还是那句话,贵精不贵多,一门学深入了,收获就会很大,总

49. 搜狗面试题: 大数相乘算法

分析: 大数能大到整形类型存储不了.须要借助于其它的算法,来完毕乘法运算. 能够使用口算乘法的步骤来模拟乘法操作.例如以下: 123 *   122 = 3 4 6 +                   3 4 6 +                1 2 3 =                  1 5 0 0 6 实现例如以下: #include<iostream> #include<string.h> using namespace std; char* MutiBiger

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的非常好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 某人贴出的測试用例数据地址: http://poj.org/showmessage?message_id=76017 有了这些用例,几下调试就过了. 我关键漏了的用例: 000.10  1 000000  1 000.00  1 .00000  0 0000

实现两个大数相乘

牛客网链接-大数相乘 思路: 内心知道这种方法是可以通过的,但是贼鸡儿麻烦. 输入两个字符串.按照笔算乘法的方式,循环计算.考虑到进位的问题. 代码: package top.simuhunluo; import java.util.Scanner; public class Main { static StringBuffer[] results; static boolean z = true; public static void main(String[] args) { Scanner

leetcode 43 Multiply Strings 大数相乘

感觉是大数相乘算法里面最能够描述.模拟演算过程的思路 class Solution { public String multiply(String num1, String num2) { if(num1.charAt(0) == '0' || num2.charAt(0) == '0'){ return "0"; } int len1 = num1.length(); int len2 = num2.length(); int len = len1+len2; int[] arr =