1308:【例1.5】高精除

【题目描述】

高精除以高精,求它们的商和余数。

【输入】

输入两个低于300位的正整数。

【输出】

输出商和余数。

【输入样例】

1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867

【输出样例】

999999999748590
179780909068307566598992807564736854549985603543237528310337

由于直接写到主函数不太方便,所以我写了几个函数。

高精除高精用到的方法是“用减法模拟除法”。

例如123÷12:

        123                        |        由于直减了一次,所以最高为是1;

     -  120                        |

——————

             3                        |        余数是3;

        

init()函数:

用于初始化输入的字符数组。

void init(int a[]){
    char s1[1001];
    cin>>s1;
    a[0]=strlen(s1);
    for(int i=0;i<a[0];i++){
        a[a[0]-i]=s1[i]-'0';
    }
}

ifnum函数: 

用于判断两个字符串的大小。

int ifnum(int a[],int b[]){
    
    if(a[0]>b[0]) return 1;
    if(a[0]<b[0]) return -1;
    for(int i=a[0];i>=1;i--){
        if(a[i]>b[i]) return 1;
        if(a[i]<b[i]) return -1;
    }
    return 0;
}

sub函数: 

用于相减连个字符串。

void sub(int a[],int b[]){
    for(int i=1;i<=a[0];i++){
        if(a[i]<b[i]){
            a[i+1]--;
            a[i]+=10;
        }
        a[i]-=b[i];
    }
    while(a[a[0]]==0 && a[0]>0) a[0]--;
}

print函数: 

用于输出字符串。

void print(int c[]){
    if(c[0]==0){
        cout<<0<<endl;
    }
    for(int i=c[0];i>=1;i--){
        cout<<c[i];
    }
}

 add函数:

用于增位减数,这里比较难理解,需要认真看看。

void add(int a[],int tmp[],int n){
    for(int i=1;i<=a[0];i++) tmp[i+n-1]=a[i];
    tmp[0]=a[0]+n-1;
}

话不多说,上源代码: 

#include<bits/stdc++.h>
using namespace std;
int a[1001],b[1001],c[1001];
void init(int a[]){
	char s1[1001];
	cin>>s1;
	a[0]=strlen(s1);
	for(int i=0;i<a[0];i++){
		a[a[0]-i]=s1[i]-'0';
	}
}
int ifnum(int a[],int b[]){
	
	if(a[0]>b[0]) return 1;
	if(a[0]<b[0]) return -1;
	for(int i=a[0];i>=1;i--){
		if(a[i]>b[i]) return 1;
		if(a[i]<b[i]) return -1;
	}
	return 0;
}
void sub(int a[],int b[]){
	for(int i=1;i<=a[0];i++){
		if(a[i]<b[i]){
			a[i+1]--;
			a[i]+=10;
		}
		a[i]-=b[i];
	}
	while(a[a[0]]==0 && a[0]>0) a[0]--;
}
void add(int a[],int tmp[],int n){
	for(int i=1;i<=a[0];i++) tmp[i+n-1]=a[i];
	tmp[0]=a[0]+n-1;
}
void print(int c[]){
	if(c[0]==0){
		cout<<0<<endl;
	}
	for(int i=c[0];i>=1;i--){
		cout<<c[i];
	}
}
int main(){
	init(a);
	init(b);
	
	c[0]=a[0]-b[0]+1;
	
	for(int i=c[0];i>=1;i--){
		int tmp[1001];
		memset(tmp,0,sizeof(tmp));
		add(b,tmp,i);
		
		while(ifnum(a,tmp)>=0){
			c[i]++;
			sub(a,tmp);
		}
	}
	while(c[c[0]]==0 && c[0]>0) c[0]--;
	print(c);
	cout<<endl;
	print(a);
	return 0;
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值