• 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;
    }
    
  • 相关阅读:
    基本计算器 II
    查看JVM使用的什么垃圾收集器
    java nio 例子
    获取jvm加载的类
    对上传的二进制视频文件进行第一帧截取
    conda与pip
    微信聊天记录导出与分析
    k8s creationTimestamp 参数
    adb logcat使用及Debug技巧
    聊聊HDR
  • 原文地址:https://www.cnblogs.com/houzm/p/12269725.html
Copyright © 2020-2023  润新知