求超大整数的乘积(C语言)

今天一个小段子在圈子里刷,说主管问妹纸8万乘以9万是多少万啊?出纳小妹答:8*9 ——72万。主管当场让妹纸回家明天不用来了。 这里面有个梗。第一个问题 80000 * 90000 =7200000000 (72 后面8个零:7亿2千万)可不绝能是72万。这里是 10 位数了,普通计算器位数可能还不够。而且我们常用的编程语言中的 int 、long (基本数据类型)等根本存不下这样大的数。以int 为例32位的编译器取值范围65535 (才 6 万多,7万都不到)。 

这里因兼容性的原因,暂不考虑采用int64 ;而在只使用基本数据类型的前提下,如果实现超大整数的乘积运算:


#include "stdafx.h"

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char * bigmul(char *m, int lena, char *f, int lenb){  //乘法运算函数。

	int i, j, k, lensum, tmp_result, carry, num = '0';
	lensum = lena + lenb;                               //确定结果数组的长度。
	for (i = 0; i < lena; i++){                            //将ASCII码转为对应的数字存储。
		m[i] = m[i] - num;

	}
	for (i = 0; i < lenb; i++){
		f[i] = f[i] - num;

	}
	char *result, final[BUFSIZ];
	result = (char*)calloc(lensum, 1);
	memset(result, 0, lensum);
	memset(final, 0, BUFSIZ);
	for (i = 0; i < lenb; i++){                
		for (j = 0; j < lena; j++){
			tmp_result = f[lenb - i - 1] * m[lena - j - 1];
			result[j + i] += tmp_result;
		}
		for (k = 0; k <= j + i - 1; k++){      
			if (result[k]>9){
				carry = result[k] / 10;
				result[k] = result[k] % 10;
				result[k + 1] += carry;
			}
		}
	}

	j = 0;
	if (result[lensum - 1] != 0){              
		final[j] = result[lensum - 1] + num;
		j++;

	}

	for (i = lensum - 2; i >= 0; i--){
		final[j++] = result[i] + num;

	}
	result = final;                            
	return result;

}

int main(){      
	
	__int64 a = 90000;
	__int64 b = 80000;
	__int64 c = a * b;
	printf("%I64d\n", c);
	
	int lena, lenb;
	char *result, sa[BUFSIZ], sb[BUFSIZ];
	
	strcpy(sa, "80000");
	strcpy(sb, "90000");

	lena = strlen(sa);
	lenb = strlen(sb);
	result = bigmul(sa, lena, sb, lenb);
	puts(result);
	
	return 0;

}