大数乘法的计算原理

引言:
最近笔者在面试BAT之类的IT公司,没想到网络笔试就需要做大数乘法之类的题型。也因为个人的原因,许久不刷OJ,代码都不会敲了。在此记录一下此次笔试的题。
随便举个例子引入正题:如果让你输入两个整数,整数的长度n(n<21),求它们的和。
接下来讲讲大数乘法的原理,代码后面贴上。
运算原理:
一般的编程语言内定的长整形的数据长度也不会有几十位,如果面试官让你计算长达上百位的数据,你该怎么办?
这个时候必须得充分利用字符串来进行操作。
1)利用字符串存储数字字符,运算时将数字字符转化成对应的整形。
2)按位累乘,将结果记录在数组中。(注意运算从右到左)
3)如果数组中的数据有进位,则需要进一位。

贴代码(如有雷同,纯属巧合Coding with C):
代码一:将进位写入迭代中;

#include
#include
#include
#define MAX_INPUT_SIZE 21//被乘数和乘数的长度
#define MAX_RESULT_SIZE (MAX_INPUT_SIZE *2 - 1)//乘积的长度

void mult(char result[], char a[], char b[])
{
    int a_len=strlen(a);//a字符串长度
    int b_len=strlen(b);//b字符串长度
    char carry=0;//进位标志
    char tmp;//临时的计算结果
    int a_index, b_index, r_index;//累加器
    //因为运算是从右往左,所以循环从数组后面开始
    for (b_index = b_len - 1; b_index >=0; b_index--)
    {//迭代累乘
        for (a_index = a_len - 1; a_index >=0; b_index--)
        {
            r_index = (b_len-1-b_index) + (a_len-1-a_index);//获取乘积的下标
            //string默认存储的是字符串,故需要减去‘0’才能得到真实的数值
            tmp = (a[a_index] - '0') * (b[b_index] - '0') + result[r_index] + carry;//计算乘积,未进位
            result[r_index] = tmp % 10;
            carry = tmp / 10;//进位结果作为下一轮循环的初值
        }
        //进位操作(在每轮迭代结束后)
        while (carry)
        {
        //子循环每轮的carry位的数据表示:乘数从低位每轮的进位累加和,所以需要循环(从高位到低位)将进位逐步记录在乘积result当中。
            r_index++;
            tmp = result[r_index] + carry;//临时存储
            result[r_index] = tmp % 10;
            carry = tmp / 10;
        }
    }
}

void print_result(char result[])
{
    int i = MAX_RESULT_SIZE - 1;
    while (!result[i])
    {
        i--;
    }
    while (i >= 0)
    {
        putchar(result[i--] + '0');
    }
    printf("\n");
}

int main(int argc,char *argv)
{
    //定义数组空间
    char a[MAX_INPUT_SIZE], b[MAX_INPUT_SIZE],result[MAX_RESULT_SIZE];

    //清零
    memset(a, 0, MAX_INPUT_SIZE);
    memset(b, 0, MAX_INPUT_SIZE);
    memset(result, 0, MAX_RESULT_SIZE);

    //取值并循环运算
    while(scanf("%s%s",&a,&b)!=EOF)
    {
    //运算
        mult(result, a, b);
    //打印结果
        print_result(result);
    }

    return 0;
}

如有问题,请指出改正!

你可能感兴趣的:(IT学习)