1 条题解

  • 1
    @ 2023-8-8 13:20:11

    水题时看到一到模板高精度除法,就点击来做题了.

    然鹅我提交了3次才过T_T

    好的我们来看一下这题.

    A/B Problem

    题目描述

    输入两个整数 a,ba,b,输出它们的商。

    输入格式

    两行,第一行是被除数,第二行是除数。

    输出格式

    一行,商的整数部分。

    样例 #1

    样例输入 #1

    10
    2
    

    样例输出 #1

    5
    

    提示

    0a1050000\le a\le 10^{5000}1b1091\le b\le 10^9


    看到数据范围,这是一道高精度除以低精度的题.We all know 高精度运算可以借鉴竖式的操作方法.那咱们就可以列一个竖式.回想一下小学一二年级柯埃的数学老师是怎么教的:

    一个算式:12025÷2512025÷25,怎么计算呢?

    (一)首先我们看被除数的前一位:1,1<251 < 25,所以商的第1位为0,当前余数为1

    (二)1×10+2=121\times 10 + 2 = 12,12<2512<25,所以商的第2位为0,当前余数为2

    (三)12×10+0=12012 \times 10 + 0= 120,120>25,[12025]=4,120mod25=20120>25,[\frac{120}{25}]=4,120 \mod 25 = 20,所以商的第3位为4,当前余数为20

    (四)20×10+2=20220 \times 10 + 2 = 202,202>25,[20225]=8,202mod25=2202>25,[\frac{202}{25}]=8,202 \mod 25 = 2,所以商的第4位为8,当前余数为2

    (五)2×10+5=252 \times 10 + 5 = 25,25=25,[2525]=1,25mod25=025=25,[\frac{25}{25}]=1,25 \mod 25 = 0,所以商的第5位为1,当前余数为0

    运算结束,得到商为00480,去掉两个前导0,得到商为480.

    那咱们就按照上面的运算过程模拟一下喽!

    Accio Code!

    #include<bits/stdc++.h>
    using namespace std;
    string A;
    int B,a[5005],b[5005];
    const int SIZE = sizeof(b);
    void piv(int a[],int k,int c[]){
    	memset(c,0,SIZE);
    	c[0]=a[0];
    	long long r=0;
    	for(int i=c[0];i>=1;i--){
    		r = r*10+a[i];
    		c[i]=r/k;
    		r%=k;
    	}
    	while(c[0]>0 && c[c[0]]==0 )c[0]--;
    }
    int main(){
    	cin>>A>>B;
    	if(A=="0"){
    		cout<<0;
    		return 0;
    	}
    	a[0]=A.size();
    	for(int i=1;i<=a[0];i++)a[i]=A[a[0]-i]-'0';
    	piv(a,B,b);
    	for(int i=b[0];i>=1;i--)cout<<b[i];
    	return 0;
    }
    

    有两个坑:一是要特判当被除数等于0的情况,二是r要开long long ,否则你就会想我一样80WA啦!

    本次题解到此结束,谢谢观看

    • 1

    信息

    ID
    479
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    61
    已通过
    16
    上传者