有正负号的大整数的乘法

1. 两个大整数用字符串形式存储;a, b, c;

2. 算C的长度时要考虑正负号,用a_left,b_left来表示大整数的起始位置,如a有负号,则a_left=1;若没有则a_left=0;

     c的长度=strlen(a)+strlen(b)-a_left-b_left;  // 若a,b都没有负号,即a_left=b_left=0,长度正常;若有负号,需要减去负号的长度;

      也就是说,c的长度是不含负号的纯数字长度

3. 计算时,a,b都从a_left,b_left开始,用s来存储结果,公式:s[i+j+1-a_left-b_left] + = (a[i]-‘0’)*(b[j]-‘0’);

4. 增加a_sign,b_sign来记录a,b的负号,最终符号记录在s[0]中;

4. 无符号的大整数乘法,没有a_left,b_left,都默认为0;

代码转自# include<stdio.h>
# include<string.h>
# include<malloc.h>

void multiply(char* a,char* b,char* c)
{
int i, j, ca, cb, *s, cs;
int a_sign=1, b_sign=1, c_sign;
int a_left, b_left;

if(a[0] == ‘-‘)
{
a_left = 1;
a_sign = -1;
}
else{
a_left = 0;
}

if(b[0] == ‘-‘)
{
b_left = 1;
b_sign = -1;
}
else{
b_left = 0;
}

ca = strlen(a);
cb = strlen(b);
cs = ca+cb-a_left-b_left;
s=(int*)malloc(sizeof(int)*cs);
for(i=0; i<cs; i++)
s[i]=0;

for(i=a_left; i<ca; i++)
for (j=b_left; j<cb; j++)
s[i+j+1-a_left-b_left] += (a[i]-‘0’)*(b[j]-‘0’);

for(i=ca+cb-1; i>=0; i–)
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}

i=0;
while (s[i]==0)
i++;

c_sign = a_sign*b_sign;
j=0;
if(c_sign == -1)
{
c[0] = ‘-‘;
j++;
}
for(; i<cs; i++,j++)
c[j] = s[i] + ‘0’;
c[j]=’\0′;
free(s);
}

void main()
{
char a[] = “-123453”;
char b[] = “987654”;
char c[50];
multiply(a,b,c);

printf(“%s\n”,c);

}

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/chuxuan12345/article/details/22040717
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞