3-7 高精度除法 c++

题目:

给两个正整数 a,b,求 a/b的整数部分。

输入格式:
输入共两行,每行一个正整数,分别表示 a和b。 50%数据,a,b均小于1e18, 50%数据,a,b均小于1e500。

输出格式:
输出一个整数,表示a/b的整数部分。

输入样例1:
3
2

输出样例1:
1

输入样例2

24781236498237462378425347823652387423654238752372365327862
8934457724628746

输出样例2:

2773669903874014740488146558678531750078864

高精度除法运算的实现:
结果表示为:商+余数
基本思路:
如,7546/23
7546先减23的100倍,减去3次,余646,商+1003;
646减23的10倍,减去2次,余186,商+10
2;
186减去23,减去8次,商+18。
最后的商为100
3+102+18=328.
在这里插入图片描述
代码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string a,b;
int aa[550],bb[550],r[550];
void duiqi(int t[],int dd)
{
	for(int i=1;i<=bb[0];i++)
		t[i+dd-1]=bb[i];
	t[0]=bb[0]+dd-1;
}
int duibi(int t[])
{
	if (aa[0]>t[0]) return 1;
    if (aa[0]<t[0]) return -1; 
    for (int i=aa[0]; i>0; i--){
        if (aa[i]>t[i]) return 1;
        if (aa[i]<t[i]) return -1;
    }return 0;
}
int main()
{	
	int i,j,la,lb;
	cin>>a>>b;
	la=a.length();
	lb=b.length();
	if(la==lb)//先处理简单情况
	{
		if(a<b)//被除数<除数,商=0 
			{cout<<"0";return 0;}
		if(a==b)//被除数=除数,商=1 
			{cout<<"1";return 0;}
	}
	else if(la<lb)//被除数<除数,商=0 
			{cout<<"0";return 0;} 
	aa[0]=la;
	bb[0]=lb;
	r[0]=aa[0]-bb[0]+1;
	for(i=0;i<la;i++)
		aa[la-i]=a[i]-'0';
	for(i=0;i<lb;i++)
		bb[lb-i]=b[i]-'0';
	for(i=r[0];i>0;i--)
	{
		int t[550]={0};//需要每次都重置 
		duiqi(t,i);
		while(duibi(t)>=0)
		{
			r[i]++;
			for(j=1;j<=aa[0];j++)
			{
				if(aa[j]<t[j])
				{
					aa[j+1]--;
					aa[j]+=10;
				}
				aa[j]-=t[j];
			}
			while(aa[aa[0]]==0)
				aa[0]--;
		}
	}
	while(r[0]>0&&r[r[0]]==0)
		r[0]--;
	for(i=r[0];i>0;i--)
		cout<<r[i];
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值