4042 - 高精度除法

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

求两个正整数之商和余数

题目输入

共两行,每行一个正整数,每个数小于1000位

题目输出

两行

第一行为第一个数除以第二个数的商

第一行为第一个数除以第二个数后的余数

输入/输出样例

输入格式

123
10

输出格式

12
3

C++解答

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N = 1005;
int a[N],b[N],c[N],d[N];

void zhuan(string s,int a[]){
	fill(a,a+N,0);
	a[0]=s.size();
	for (int i=1; i<=a[0]; i++) a[i]=s[a[0]-i]-48;
}

void mul10(int a[]){
	if (a[0]==1 && a[1]==0) return;
	for (int i=a[0]; i>=1; i--) a[i+1]=a[i];
	a[1]=0;
	a[0]++;
}

bool isbig(int a[],int b[]){
	if (a[0]!=b[0]) return a[0]>b[0];
	for (int i=a[0]; i>=1; i--)
		if (a[i]!=b[i]) return a[i]>b[i];
	return true;
}

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]>1) a[0]--;
}

void div(int a[],int b[],int c[],int d[]){
	fill(c,c+N,0);
	fill(d,d+N,0);
	c[0]=a[0];
	d[0]=1;
	for (int i=c[0]; i>=1; i--){
		mul10(d);
		d[1]=a[i];
		while (isbig(d,b)){
			sub(d,b);
			c[i]++;
		}
	}
	while (c[c[0]]==0 && c[0]>1) c[0]--;
}

void output(int a[]){
	for (int i=a[0]; i>=1; i--) cout<<a[i];
	cout<<endl;
}

int main(){
	string s1,s2;
	cin>>s1>>s2;
	zhuan(s1,a); zhuan(s2,b);
	div(a,b,c,d);
	output(c);
	output(d);
	return 0;
}

Java解答

import java.math.BigDecimal;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		BigDecimal b1 = cin.nextBigDecimal();
		BigDecimal b2 = cin.nextBigDecimal();
		BigDecimal[] b3 = b1.divideAndRemainder(b2);
		System.out.println(b3[0]);
		System.out.println(b3[1]);
	}
}