最简单的C语言实现大数相乘

前言 : 实现大数相乘比相加要难一点 , 但是仔细分析会发现很多共同之处 

分析 : 

1. 由数学归纳法会发现用一般的两数相乘方法计算 , 每计算一次都能够确定最终结果的一位数字

2. 比如说 : 456 * 123

    下面我用草稿描述 , 字丑请见谅 .............最简单的C语言实现大数相乘_第1张图片

3. 第一步我们可以确定个位 , 第二步可以确定十位 , 第三步是百位 .......以此类推 , 第n步由n个步骤才能最终确定 , 所以代码也就呼之欲出了

#include 
#include 
#include 
 

char * MultipyBigNumber(char *s,char *p);   /*  函数声明  */


int main()
{
	char s[] = "100000000000000000000000000000000000000";
	char p[] = "99999999999999";
	puts(MultipyBigNumber(s,p));
	return 0;
}


char* MultipyBigNumber(char *s,char *p)
{
	int i,j,x,bit1,bit2;
	int len1 = strlen(s);
	int len2 = strlen(p);
	int len3 = len1 + len2;      /*  结果的位数最大应为两个长度相加  */
	char *arr;

	arr = (char*)malloc(sizeof(char)*(len3+1));  
	arr[len3] = '\0';
	arr = &arr[len3];
	len1--;
	len2--;
	i = x = 0;

	while(i < len3 - 1 || x != 0)
	{
		for(j = 0; j <= i; j++)
		{
			bit1 = len1 - i + j;   /*  第一个数从当前最高位开始递减到个位  */
			bit2 = len2 - j;         /*  第二个数从个位到当前最高位  */
			if(bit1 >= 0 && bit2 >= 0)  /*  当两个位数都有效才相乘,防止出现位数不相称情况  */
				x += (s[bit1] - '0') * (p[bit2] - '0');
		}
		*(--arr) = x % 10 + '0';
		x /= 10;
                i++;
	}
        if(*arr++ == '0')        /*  如果结果为0,只返回一个0即可,不用返回n个0  */
		*arr = '\0';
	return --arr;
}

例 : 

char s[] = "100000000000000000000000000000000000000";
char p[] = "99999999999999";

最简单的C语言实现大数相乘_第2张图片

你可能感兴趣的:(最简单的C语言实现大数相乘)