题目描述
给定两个非负整数(不含前导 0
) A,B
,请你计算 A/B
的商和余数。
输入格式
共两行,第一行包含整数 A
,第二行包含整数 B
。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000
,
1≤B≤10000
,
B
一定不为 0
输入样例:
7
2
输出样例:
3
1
样例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//A/b,商是C,余数是r
vector<int> div(vector<int> &A,int b,int &r)
{
vector<int> C; //商
r = 0;
for(int i=A.size()-1;i>=0;i--) //由于是反数存储[2,2,1,1,5,9,9,1,3,7],从7读取,从最高位读取
{
r = r*10+A[i];//将上次的余数*10在加上当前位的数字,便是该位需要除的被除数
C.push_back(r/b);//所得即为商在这一位的数字
r%=b;
}
//C=[0,3,8,5,2,6,0,5,8,5]
reverse(C.begin(),C.end());//C=[5,8,5,0,6,2,5,8,3,0]
while (C.size() > 1 && C.back() == 0) C.pop_back(); // 去前导 0,C=[5,8,5,0,6,2,5,8,3]
return C;
}
int main()
{
string a;
int b,r;
vector<int> A,C;
cin>>a>>b;//a='7319951122',b='19'
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');//a=[2,2,1,1,5,9,9,1,3,7] 反数存储
C = div(A,b,r);
for(int i = C.size()-1;i>=0;i--) //反向读取 C=[3,8,5,2,6,0,5,8,5] 正确答案
printf("%d",C[i]);
cout<<endl<<r<<endl;
return 0;
}