经典算法面试题(四):大数相乘

(一)基本思路

如果数很大的话,可以用字符串来表示。在计算的过程中,字符串可以转化为数组,两个数组的元素挨个相乘,再考虑进位,问题即可解决。

为了简化问题,以25 * 48为例:

经典算法面试题(四):大数相乘_第1张图片
1.png

第(1)行的数组a存放的是被乘数,a[0] = 5, a[1] =2

第(2)行的数组b存放的是乘数,a[0] = 7, a[1] = 4

第(5)行的数组c存放的是相乘的结果
c[0] = a[0] * b[0]
c[1] = a[0] * b[1] +a[1] * b[0]
a[2] = a[1] * b[1]

第(6)行的数组d存放的是进位后的结果,也就是最终结果
d[0] = c[0] % 10 = 5
d[1] = (c[1] + 前一个元素的进位数) % 10 = (34 + 3) % 10 = 7
d[2] = ((c[2] + 前一个元素的进位数) % 10 = (8 + 3) % 10 = 1
d[3] = 前一个元素的进位数 = 1

(二)C语言实现

#include 
#include 
#include 

#define N 100

/**
 * @brief 将在字符数组中保存的字符串转成数字存到int数组中
 * @param s:字符串形式的数
 * @param a:整形数组用来放大整数
 */
void getdigits(int *a,char *s)
{
    int i;
    int len = strlen(s);
    
    // 对数组初始化
    for(i = 0; i < N; i++)
    {
        *(a + i) = 0;
    }
    
    for(i = 0; i < len; i++)
    {
        // 字符串s="12345",对应a[0]=5,a[1]=4,a[2]=3,a[3]=2,a[4]=1 
        *(a + len - 1 - i) = *(s + i) - '0';
    }
}

/**
 * @brief 将数组a与数组b逐位相乘以后存入数组c
 * @param a:被乘数
 * @param b:乘数
 * @param c:积
 */
void multiply(int *a,int *b,int *c)
{
    int i,j;
    
    // 数组初始化
    for(i = 0; i < 2 * N; i++)
    {
        *(c + i) = 0;
    }
    
    // 数组a中的每位逐位与数组b相乘,并把结果存入数组c
    // c[0] = a[0] * b[0]
    // c[1] = a[0] * b[1] + a[1] * b[0]
    // c[2] = a[0] * b[2] + a[1] * b[1] + a[2] * b[0]
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            *(c + i + j) += *(a + i) * *(b + j);
        }
    }
    
    // 移位、进位
    for(i = 0; i < 2 * N - 1; i++)
    {
        *(c + i + 1) += *(c + i)/10; //将十位上的数向前进位,并加上原来这个位上的数
        *(c + i) %= 10;             //将剩余的数存原来的位置上
    }
}

int main()
{
    int a[N], b[N], c[2*N];
    char s1[N], s2[N];
    
    printf("input the first number: ");
    scanf("%s",s1);
    
    printf("input the second number: ");
    scanf("%s",s2);
    
    getdigits(a,s1);
    
    getdigits(b,s2);
    
    multiply(a,b,c);
    int  i = 2 * N - 1 ;
    while(0 == c[i])
    {
        // 左边的0不用输出
        i--;
    }
    
    printf("The result is: ");
    while (i >= 0)
    {
        printf("%d",c[i]);
        i--;
    }
    
    return 0;
}

运行结果:

input the first number: 12345678
input the second number: 23456789
The result is: 289589963907942




更多内容请关注微信公众号


wechat_344.jpg

你可能感兴趣的:(经典算法面试题(四):大数相乘)