您的位置:首页 > 职场人生

大数乘法的计算原理

2016-03-25 09:41 447 查看
引言:

最近笔者在面试BAT之类的IT公司,没想到网络笔试就需要做大数乘法之类的题型。也因为个人的原因,许久不刷OJ,代码都不会敲了。在此记录一下此次笔试的题。

随便举个例子引入正题:如果让你输入两个整数,整数的长度n(n<21),求它们的和。

接下来讲讲大数乘法的原理,代码后面贴上。

运算原理:

一般的编程语言内定的长整形的数据长度也不会有几十位,如果面试官让你计算长达上百位的数据,你该怎么办?

这个时候必须得充分利用字符串来进行操作。

1)利用字符串存储数字字符,运算时将数字字符转化成对应的整形。

2)按位累乘,将结果记录在数组中。(注意运算从右到左)

3)如果数组中的数据有进位,则需要进一位。

贴代码(如有雷同,纯属巧合Coding with C):

代码一:将进位写入迭代中;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#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;
}


如有问题,请指出改正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数乘法 面试