大数相乘问题

题目

编写两个任意位数的大数相乘的程序,给出计算结果。

分析

1.数字无法用一个整形变量存储,所以需要利用字符串来表示一串数字。
2.根据乘法的运算规则,用一个乘数的每一位乘以另一个乘数,然后将中间结果按正确位置相加得到最终结果。
3.如果乘数为A和B,A的位数为m,B的位数为n,则乘积结果为m+n-1位(最高位无进位)或m+n位(最高位有进位)。因此可以分配一个m+n的辅存来存储最终结果。

本题目采用移位进位法,其时间复杂度为O(N²),基本思路简述如下:
按照乘法的计算过程来模拟计算:

  1 2
×3 6
——————————
  71 2  

36
————————
413 2
(其中,上标数字为进位数值。)

源码如下(c实现)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void muti(char *num_1, char*num_2)
{
    int lennum_1, lennum_2;
    int*s;
    char*num;
    lennum_1 = strlen(num_1);
    lennum_2 = strlen(num_2);
    s = (int*)malloc((lennum_1 + lennum_2) * sizeof(int));
    num = (char*)malloc((lennum_1 + lennum_2+1) * sizeof(char));
    int i, j;
    for (i = 0; i < (lennum_1 + lennum_2); i++)
        s[i] = 0;
    for(i=0;i<lennum_1;i++)
        for (j = 0; j < lennum_2; j++)
            s[i + j + 1] = (num_1[i] - '0')*(num_2[j] - '0');
    for (i = (lennum_1 + lennum_2 - 1); i >= 0; i--)
        if (s[i] >= 10)
        {
            s[i - 1]+= s[i] / 10;
            s[i] %= 10;
        }
    i = 0;
    if (!s[0])
        i++;
    for (j = 0; j < (lennum_1 + lennum_2); i++, j++)
        printf("%c",s[i] + '0');
}

希望您能留下一个赞(
^▽^)

更多内容请戳:我的个人博客

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/xjm850552586/article/details/79107823
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞