题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552
题目:
1017 A除以B (20分)
本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式:
输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式:
在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
解题思路:
大数除法,如果用python可以直接求解,在c/c++中根据除法的性质来获取最终的结果,num位 A[i:j]中组成的高位数
1、如果num>B则得到尚和余数,将尚压入ret中,若没到最后一位数,则尚d = d*10 + A[j+1]。
2、如果num<B,若ret中不为空,则压入0。
3、输出 ret以及余数d即可
在我的代码中我使用的c++ oop编程达到c++巩固以及算法能力的提高。
解题代码:
#include<bits/stdc++.h>
#define rep(i,s,e) for(int i =s ; i<e;i++)
using namespace std;
const int maxsize = 1010;
class Sovle{
public:
void init();
void print();
void getAnswer();
Sovle(int maxsize);
~Sovle();
private:
vector<int> ret;//保存结果
//输入结果
int *A;
int maxsize,len;//最大值
int B;
int dn;
};
Sovle::Sovle(int maxsize){
this->maxsize = maxsize;
A = new int[maxsize];
}
Sovle::~Sovle(){
ret.clear();
delete A;
}
void Sovle::init(){
char *ch = new char[maxsize];
cin>>ch;
cin>>B;
len = strlen(ch);
rep(i,0,len){
A[i] = ch[i] -'0';
}
}
void Sovle::print(){
int len = ret.size();
if(len==0) cout<<0;
rep(i,0,len){
cout<<ret[i];
}
cout<<" "<<dn;
}
void Sovle::getAnswer(){
int num = 0;
rep(i,0,len){
num = num*10+A[i];
if(num/B>0){
ret.push_back(num/B);
num = num%B;
}else{
if(ret.size()>0){
ret.push_back(0);
}
}
}
dn = num;
}
int main()
{
Sovle *sl = new Sovle(maxsize);
sl->init();
sl->getAnswer();
sl->print();
return 0;
}