有正负号的大整数的乘法

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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。以下是大整数运算实现两数的加、减、乘、除、幂运算的方法: 1. 加法运算 大整数加法运算的实现方法是将两个大整数的每一位相加,并将进位传递到下一位。如果两个整数位数不同,则在较短的整数前面补零。具体实现如下: ```python def add(num1, num2): # 将两个整数转换为字符串,方便逐位相加 str1, str2 = str(num1), str(num2) # 将两个字符串前面补零,使它们的位数相同 str1, str2 = str1.zfill(max(len(str1), len(str2))), str2.zfill(max(len(str1), len(str2))) # 逐位相加 res = '' carry = 0 for i in range(len(str1) - 1, -1, -1): temp_sum = int(str1[i]) + int(str2[i]) + carry carry = temp_sum // 10 res = str(temp_sum % 10) + res if carry: res = str(carry) + res return int(res) ``` 2. 减法运算 大整数减法运算的实现方法是先将两个整数的绝对值相减,再根据正负号决定运算结果的正负号。具体实现如下: ```python def subtract(num1, num2): # 将两个整数转换为字符串,方便逐位相减 str1, str2 = str(num1), str(num2) # 将两个字符串前面补零,使它们的位数相同 str1, str2 = str1.zfill(max(len(str1), len(str2))), str2.zfill(max(len(str1), len(str2))) # 如果 num1 < num2,则交换 num1 和 num2,并标记结果为负数 if num1 < num2: str1, str2 = str2, str1 negative = True else: negative = False # 逐位相减 res = '' borrow = 0 for i in range(len(str1) - 1, -1, -1): temp_diff = int(str1[i]) - int(str2[i]) - borrow if temp_diff < 0: temp_diff += 10 borrow = 1 else: borrow = 0 res = str(temp_diff) + res # 去掉前导零 res = res.lstrip('0') if not res: res = '0' # 根据正负号返回结果 if negative: return -int(res) else: return int(res) ``` 3. 乘法运算 大整数乘法运算的实现方法是将两个整数的每一位相乘,并将结果累加到对应的位数上。具体实现如下: ```python def multiply(num1, num2): # 将两个整数转换为字符串,方便逐位相乘 str1, str2 = str(num1), str(num2) # 将两个字符串前面补零,使它们的位数相同 str1, str2 = str1.zfill(max(len(str1), len(str2))), str2.zfill(max(len(str1), len(str2))) # 逐位相乘 res = '0' for i in range(len(str1) - 1, -1, -1): temp_prod = '' carry = 0 for j in range(len(str2) - 1, -1, -1): temp_prod = str((int(str1[i]) * int(str2[j]) + carry) % 10) + temp_prod carry = (int(str1[i]) * int(str2[j]) + carry) // 10 if carry: temp_prod = str(carry) + temp_prod temp_prod += '0' * (len(str1) - i - 1) res = str(add(int(res), int(temp_prod))) # 去掉前导零 res = res.lstrip('0') if not res: res = '0' return int(res) ``` 4. 除法运算 大整数除法运算的实现方法是将被除数不断减去除数,直到被除数小于除数为止。具体实现如下: ```python def divide(num1, num2): # 将两个整数转换为字符串,方便逐位相除 str1, str2 = str(num1), str(num2) # 将两个字符串前面补零,使它们的位数相同 str1, str2 = str1.zfill(max(len(str1), len(str2))), str2.zfill(max(len(str1), len(str2))) # 如果除数为 0,则抛出异常 if num2 == 0: raise ZeroDivisionError # 如果被除数小于除数,则直接返回 0 if num1 < num2: return 0 # 逐位相除 res = '' dividend = 0 for i in range(len(str1)): dividend = int(str(dividend) + str1[i]) quotient = dividend // int(str2) dividend = dividend % int(str2) res += str(quotient) # 去掉前导零 res = res.lstrip('0') if not res: res = '0' return int(res) ``` 5. 幂运算 大整数幂运算的实现方法是使用快速幂算法。具体实现如下: ```python def power(num, exp): # 如果指数为 0,则返回 1 if exp == 0: return 1 # 如果指数为负数,则将底数取倒数,指数取相反数 if exp < 0: num = 1 / num exp = -exp # 使用快速幂算法计算幂运算 res = 1 while exp > 0: if exp % 2 == 1: res *= num num *= num exp //= 2 return res ``` 以上就是大整数运算实现两数的加、减、乘、除、幂运算的方法,希望可以帮到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值