高精度除法(高精除以高精)模板

(若想查看高精除以单精,请点击链接)链接
嗯,这个还有点儿难度(虽然不常用),其实也不难,稍微讲讲吧!

在用竖式计算除法的时候,用减法模拟每次的相除,从高位到低位,每次减到不能再减为止,然后向后移一位。嗯,就这样。

Code

#include<bits/stdc++.h>
using namespace std;

int c[300];
char ch1[300],ch2[300],ans[300];

bool cmp(int p,char ch1[],char ch2[])//对前p位的被除数字符串ch1和整个除数字符串ch2比较大小
{
   
   
	int l=1;
	while(ch1[l]=='0'&&l<=p-1) l++;//删除被除数的第p位之前已经被减为0的位
	char tch[300];
	int cnt=0;
	for(int i=l;i<=p;i++)
	{
   
   
		tch[++cnt]=ch1[i];//把被除数删完之后的部分存储在tch里
	}
	tch[cnt+1]='\0';
	if(strlen(tch+1)>strlen
高精度除法代码编写通常有不同的实现方式,下面介绍两种常见方法及对应代码: ### 暴力减法法 此方法的核心思想是不断用被除数减去除数,每减一次商就加1,直到被除数小于除数。以下是具体代码示例: ```cpp #include<iostream> #include<cstdio> using namespace std; int a[20005],b[20005]; int main() { string x,y; cin>>x>>y; int s1=x.length(),s2=y.length(); for(int i=0;i<s1;i++) { a[s1-i]=x[i]-'0'; } for(int i=0;i<s2;i++) { b[s2-i]=y[i]-'0'; } if(s1<s2) { printf("0"); } else if(s1==s2&&x<y) { printf("0"); } else { int ans=0; while(s1>=s2||(a[s1]>=b[s1]&&a[s1]!=0)) { ans++; for(int i=1;i<=s1;i++) { a[i]-=b[i]; if(a[i]<0) { a[i]+=10; a[i+1]-=1; } } while(a[s1]==0&&s1>1) { s1--; } } printf("%d",ans); } return 0; } ``` 该代码首先读取两个大整数作为字符串,接着将字符串转换为整数数组存储。然后比较两个数的大小,若被除数小于除数则商为0。若不小于,则不断用被除数减去除数,每次相减后更新被除数,直到被除数小于除数,最后输出商的值[^2]。 ### 优化算法 此方法引入了`big`函数来判断某一位置开始的一段被除数是否大于等于除数,然后在`div`函数中通过循环和调用`big`函数来进行除法运算。以下是具体代码示例: ```cpp bool big(int a[],int b[],int low,int L){ if(a[low+L]!=0) return 1; for(int i=L-1;i>=0;--i){ if(a[low+i]>b[i]) return 1; if(a[low+i]<b[i]) return 0; } return 1; } void div(int a[],int b[],int c[],int d[]){ clear(c); clear(d); int la,lb; for(la=L-1;la>0;la--){ if(a[la-1]!=0) break; } for(lb=L-1;lb>0;lb--){ if(b[lb-1]!=0) break; } if(lb==0) return; for(int i=0;i<la;i++) d[i]=a[i]; for(int i=la-lb;i>=0;i--){ while(big(d,b,i,lb)){ for(int j=0;j<lb;j++){ d[i+j]-=b[j]; if(d[i+j]<0){ d[i+j+1]-=1; d[i+j]+=10; } } c[i]++; } } } ``` 在这段代码中,`big`函数用于比较从`low`位置开始长度为`L`的被除数部分和除数的大小。`div`函数则是核心的除法运算函数,首先清除商数组`c`和余数数组`d`,然后确定被除数和除数的有效长度,接着将被除数复制到余数数组`d`中,最后通过循环和`big`函数进行多次减法操作,每成功减一次就在商数组`c`的相应位置加1 [^1]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值