1017 A除以B (20分)
題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805305181847552
本題要求計算 A/B,其中 A 是不超過 1000 位的正整數,B 是 1 位正整數,你需要輸出商數 Q 和余數 R,使得 A=B×Q+R 成立,
輸入格式:
輸入在一行中依次給出 A 和 B,中間以 1 空格分隔,
輸出格式:
在一行中依次輸出 Q 和 R,中間以 1 空格分隔,
輸入樣例
123456789050987654321 7
輸出樣例
17636684150141093474 3
我的理解
A為不超過1000位的正整數,不是不超過1000,是1000位,用string存盤,B是一位正整數,short即可,好像是大整數的除法問題的簡化,除數只有一位,回圈遍歷A,將A中的字符轉化為數值進行計算,將每次的商轉化為字串拼接,每次的余數參與下一次的被除數,兩點注意,
- 在回圈遍歷時,有可能會出現余數為0的情況,如果余數為0,則只有下一字符作為被除數,例如321 / 3,第一步的商為1,但是余數為0,下一步的被除數為2,
- 最終的商可能出現以0開始的字串,例如123 / 2,按照這種逐步計算相除的方式,商最后為061,此時則需要將前面的0給去掉,
代碼段
#include <iostream>
#include <string>
using namespace std;
int main() {
string A;
string Q = "";
// 被除數
int m;
// 除數
short n;
// 商
int p = 0;
// 余數
int q = 0;
cin >> A >> n;
int limit = A.length();
string::size_type sz;
for (int i = 0; i < limit; i++) {
// 被除數
if (q == 0) {
// 字符轉數字
m = (int)(A[i] - '0');
} else {
string temp = to_string(q).append(to_string(A[i] - '0'));
m = stoi(temp, &sz);
}
p = m / n;
q = m % n;
Q.append(to_string(p));
}
// 處理商前面可能出現0的情況,以及避免商僅為0,例如 3 / 7
if (Q.find_first_of('0') == 0 && Q.length() > 1) {
Q.erase(0, 1);
}
cout << Q << " " << q << endl;
}
更改程序
- 字符轉數字,以及商的拼接,因為沒好好學C++,導致這個轉化問題沒少為難,使用
to_string()的時候,怎么也沒有想到to_string('1')的回傳值竟然會是其對應的ASCCI碼值——49,難搞哦,既然是ASCCI碼值,那就按照ASCCI碼來計算吧,減去‘0’的值,即可與預期相符, - 在去除商前綴為0的情況時,忽略了商為0的情況,例如,8 / 9,所以在去除0的同時要保證商字串的長度大于1,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102306.html
標籤:其他
上一篇:學的Java,有一個做bi的offer,想問問bi是干嘛的?發展前景如何
下一篇:不同影像的清晰度比較
