高精度乘法、除法

本文详细介绍了如何使用高精度算法实现乘法和除法操作,包括vector类型的数据结构,从低位到高位的处理方式,以及反转操作以适应从高位到低位的除法计算。通过实例展示了代码实现,并强调了前后一致性与操作细节。
摘要由CSDN通过智能技术生成

乘法和之前的代码类似

​
//高精度乘法:高精度 * 低精度
vector<int>mul(vector<int>A,int b)
{
	vector<int> ans;
	int carry=0;
	for(int i=0;i<A.size()||carry/*处理最后一位*/;i++)
	{
		if(i<A.size())
		carry=carry+A[i]*b;
		ans.push_back(carry%10);
		carry=carry/10;
	}
	while(ans.size()>1&&ans.back()==0)
	ans.pop_back;
	return ans; 
} 

​

除法会稍微复杂一些,在纸上举一个例子结合代码更好理解

注意:之前加法减法乘法都是从最低位开始算,而除法需要从高位开始计算,为了保持和前面的一致,采用相同的储存方式,所以计算之前需要反转,计算之后也要反转。

//高精度除法:高精度 / 低精度 
vector<int> div(vector<int>A,int b,int r)//r为余数
{
	vector<int> ans;
	int carry=0;
	r=0;
	for(int i=A.size()-1;i>=0;i--)//实现第一次反转 
	{
		r=r*10+A[i];//相当于在纸上落下来对齐的操作 
		ans.push_back(r/b);
		r=r%b; 
	}
	reverse(ans.begin(),ans.end());//反转函数实现第二次反转 
	while(ans.size()>1&&ans.back()==0)
	ans.pop_back;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然!以下是一个用C语言实现的高精度乘法和高精度除法的代码示例: 高精度乘法: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 void multiply(char *num1, char *num2, char *result) { int len1 = strlen(num1); int len2 = strlen(num2); int len = len1 + len2; int i, j, k; int carry; int temp; int product; int *multiplyArray = (int *)malloc(len * sizeof(int)); memset(multiplyArray, 0, len * sizeof(int)); for (i = len1 - 1; i >= 0; i--) { carry = 0; for (j = len2 - 1; j >= 0; j--) { temp = (num1[i] - '0') * (num2[j] - '0') + carry + multiplyArray[i + j + 1]; product = temp % 10; carry = temp / 10; multiplyArray[i + j + 1] = product; } multiplyArray[i + j + 1] = carry; } k = 0; for (i = 0; i < len; i++) { if (multiplyArray[i] != 0 || k != 0) { result[k++] = multiplyArray[i] + '0'; } } result[k] = '\0'; free(multiplyArray); } int main() { char num1[MAX_LEN]; char num2[MAX_LEN]; char result[MAX_LEN * 2]; printf("请输入乘数: "); scanf("%s", num1); printf("请输入被乘数: "); scanf("%s", num2); multiply(num1, num2, result); printf("乘法结果: %s\n", result); return 0; } ``` 高精度除法: ```c #include <stdio.h> #include <string.h> #define MAX_LEN 1000 int compare(char *num1, char *num2) { int len1 = strlen(num1); int len2 = strlen(num2); if (len1 > len2) { return 1; } else if (len1 < len2) { return -1; } else { return strcmp(num1, num2); } } void subtract(char *num1, char *num2) { int len1 = strlen(num1); int len2 = strlen(num2); int i, diff; int borrow = 0; for (i = 0; i < len2; i++) { diff = (num1[i] - '0') - (num2[i] - '0') - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } num1[i] = diff + '0'; } for (; i < len1; i++) { diff = (num1[i] - '0') - borrow; if (diff < 0) { diff += 10; borrow = 1; } else { borrow = 0; } num1[i] = diff + '0'; } i = len1 - 1; while (i > 0 && num1[i] == '0') { num1[i] = '\0'; i--; } } void divide(char *num1, char *num2, char *result) { int len1 = strlen(num1); int len2 = strlen(num2); if (compare(num1, num2) < 0) { strcpy(result, "0"); return; } char remainder[MAX_LEN]; memset(remainder, '\0', sizeof(remainder)); int idx = 0; char temp[MAX_LEN]; for (int i = 0; i < len2; i++) { temp[idx++] = num1[i]; } for (int i = len2; i <= len1; i++) { int count = 0; while (compare(temp, num2) >= 0) { subtract(temp, num2); count++; } result[i - len2] = count + '0'; if (i < len1) { strcat(temp, &num1[i]); } } strcpy(remainder, temp); } int main() { char num1[MAX_LEN]; char num2[MAX_LEN]; char result[MAX_LEN]; printf("请输入被除数: "); scanf("%s", num1); printf("请输入除数: "); scanf("%s", num2); divide(num1, num2, result); printf("整数商: %s\n", result); return 0; } ``` 你可以输入两个数字进行测试,代码会计算并输出乘法结果和除法结果。请注意,这些代码只适用于非负整数的高精度乘法除法运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值