Hướng dẫn giải của BASE04: Số bát phân sang thập phân
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng dẫn giải
Đổi số S từ hệ bát phân sang thập phân. S được nhập dưới dạng chuỗi chữ số bát phân, giá trị tối đa 8^10 nên kết quả vừa kiểu long long.
Sub 1: Cộng trọng số 8^i — ~O(L^2)~
Chữ số thứ i tính từ phải (bắt đầu từ 0) có trọng số 8^i, tính 8^i bằng cách nhân 8 liên tiếp rồi cộng d·8^i. Đạt 20/20 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
bool neg = false;
if (s[0] == '-') { neg = true; s = s.substr(1); }
// Vét cạn: chữ số thứ i (tính từ phải, bắt đầu từ 0) có trọng số 8^i, tính bằng cách nhân liên tiếp
long long res = 0;
int m = s.size();
for (int i = 0; i < m; i++) {
int d = s[m - 1 - i] - '0';
long long w = 1;
for (int j = 0; j < i; j++) w *= 8; // 8^i
res += d * w;
}
cout << (neg ? -res : res) << "\n";
return 0;
}
Sub 2: Nhân 8 rồi cộng (Horner) — ~O(L)~
Đọc các chữ số từ trái sang phải, mỗi bước đặt res = res·8 + chữ số. Đạt 20/20 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
bool neg = false;
if (s[0] == '-') { neg = true; s = s.substr(1); }
// Đọc từ trái sang phải: mỗi chữ số làm giá trị nhân 8 rồi cộng chữ số mới (kiểu Horner)
long long res = 0;
for (char c : s) res = res * 8 + (c - '0');
cout << (neg ? -res : res) << "\n";
return 0;
}
Bình luận