PAT Basic 1017 A除以B (20) [数学问题-⼤整数运算]

题目

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成⽴。
输⼊格式:
输⼊在1⾏中依次给出A和B,中间以1空格分隔。
输出格式:
在1⾏中依次输出Q和R,中间以1空格分隔。
输⼊样例:
123456789050987654321 7
输出样例:
17636684150141093474 3

题目分析

已知一个不超过1000位的数字N,和一个1位的正整数,求商和余数

  • 因为N不超过1000位,所以看做大整数处理

解题思路

思路1

  1. 大整数除法,余数使用引用传入,返回商

思路2

高精度常规解法

Code

Code 01

#include <iostream>
using namespace std;
string div(string a, int b, int &r) {
	string c;
	for(int i=0; i<a.length(); i++) {
		int temp = a[i]-'0';
		r = r*10+temp; //本轮被除数
		if(r<b) c.push_back('0');
		else {
			c.push_back(r/b+'0');
			r=r%b;
		}
	}
	while(c[0]=='0'&&c.length()>1) {
		c.erase(c.begin());
//		c.erase(0,1); //这种方式也可以
	}
	return c;
}
int main(int argc,char * argv[]) {
	string A;
	int B;
	cin>>A>>B;
	int r=0;
	string s = div(A,B,r);
	printf("%s %d",s.c_str(),r);
	return 0;
}

Code 02(高精度加法-常规写法)

#include <iostream>
#include <cstring>
using namespace std;
struct bign {
	int d[1100];
	int len;
	bign() {
		memset(d,0,sizeof(d));
		len = 0;
	}
};
bign change(char str[]) {
	bign a;
	a.len=strlen(str);
	for(int i=0; i<a.len; i++) {
		a.d[i]=str[a.len-1-i]-'0';
	}
	return a;
}
bign divid(bign a, int b, int &r) {
	bign c;
	c.len=a.len; //商和被除数一一对应,所以长度相等
	for(int i=a.len-1; i>=0; i--) {
		r=r*10+a.d[i];
		if(r<b) c.d[i]=0;
		else {
			c.d[i]=r/b;
			r = r%b;
		}
	}
	// 去除商前面多余的0
	while(c.len-1>=1&&c.d[c.len-1]==0) c.len--;
	return c;
}
void print(bign a){
	for(int i=a.len-1;i>=0;i--){
		printf("%d",a.d[i]);
	}
}
int main(int argc,char * argv[]) {
	char str[1100];
	scanf("%s",str);
	int b,r=0;
	scanf("%d",&b);
	bign a = change(str);
	bign d = divid(a, b, r);
	print(d);
	printf(" %d",r); //余数 
	return 0;
}
posted @ 2020-02-06 18:24  JamieHou  阅读(134)  评论(0编辑  收藏  举报