주제 내용
이 문제는 A/B를 계산하도록 요청합니다. 여기서 A는 최대 1000자리의 양의 정수이고 B는 1자리의 양의 정수입니다. A=B×Q+R이 성립하도록 몫 Q와 나머지 R을 출력해야 합니다.
입력 형식:
입력은 A와 B를 1 공백으로 구분하여 한 줄에 순차적으로 제공합니다.
출력 형식:
Q와 R을 공백 1칸으로 구분하여 한 줄에 차례로 출력합니다.
입력 샘플:
123456789050987654321 7
끝에 빈 줄이 없음
샘플 출력:
17636684150141093474 3
끝에 빈 줄이 없음
문제 해결 아이디어
방법 1 일반적인 방법
이 문제는 고정밀 컴퓨팅의 고전적인 문제로, 문제에서 A의 범위는 1000자리를 넘지 않으므로 과격하게 평가하기 위해 long을 사용해서는 안 됩니다. 문자열 유형은 A를 읽고 문자열의 각 비트를 개별적으로 계산하고 1비트를 계산하고 1비트를 출력합니다.
방법 2는 벡터를 사용하여 수행
벡터의 특성을 이용하여 삽입과 삭제가 용이하도록 문자열을 벡터에 역순으로 저장한 다음 데이터를 순회하여 벡터에 저장하고 특수한 결과를 처리한 후 역순으로 출력할 수 있다.
상세 코드
방법 1
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
string A;
int B;
int Q = 0,R = 0; //Q表示商,R表示每次运算的余数
bool isFirst = true;
cin>>A>>B;
for(int i = 0;i<A.length();i++){
Q = (R*10+A[i]-'0')/B;
//Q为0只有不在字符串的头一个且整个字符串的长度不唯一或者字符串长度为1时才输出
if(isFirst&&A.length()>1){
if(Q!=0){
cout<<Q;
isFirst = false;
}
}else{
cout<<Q;
}
R = (R*10+A[i]-'0')%B;
}
cout<<" "<<R;
}
방법 2
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> div(vector <int> a,int b,int &r){
vector <int> c; //用于存放计算结果
int y = 0;
for(int i = a.size()-1;i>=0;i--){
y = y*10+a[i]; //y表示余数
c.push_back(y/b);
y=y%b;
}
r = y; //保留最后的余数
reverse(c.begin(),c.end()); //c不是最后的结果,他是结果的逆序,所以逆转过来以后会存在首值为0的情况,所以我们需要提前逆转过来,删除首部的0
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
int main(){
string a;
int b,r;
cin>>a>>b;
vector <int> A;
//为了方便计算,将字符串a逆着写入vector中
for(int i = a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
vector <int> c = div(A,b,r);
for(int i = c.size()-1;i>=0;i--) cout<<c[i];
cout<<" "<<r;
return 0;
}