Hướng dẫn giải của Tính tổng
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
Cho dãy n số nguyên dương (10 ≤ a_i ≤ 10^6, n ≤ 10^6). Tính tổng các phần tử có chữ số hàng đơn vị lớn hơn chữ số hàng chục.
Ví dụ: dãy 15 141 28 66 79 có các số 15, 28, 79 thoả mãn (5 > 1, 8 > 2, 9 > 7), tổng 122.
Sub 1: Vét cạn bằng xâu — ~O(n · độ dài)~
Đổi mỗi số thành xâu chữ số, so sánh ký tự cuối với ký tự đứng ngay trước nó; nếu lớn hơn thì cộng số đó vào tổng. Đạt 20/20 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("Tinhtong.inp", "r", stdin);
freopen("Tinhtong.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
long long a;
cin >> a;
// Vét cạn: đổi số thành xâu chữ số, so sánh ký tự hàng chục và hàng đơn vị
string s = to_string(a);
int m = s.size();
if (s[m - 1] > s[m - 2]) sum += a;
}
cout << sum << '\n';
return 0;
}
Sub 2: Dùng phép chia lấy dư — ~O(n)~
Chữ số hàng đơn vị là a % 10, chữ số hàng chục là (a / 10) % 10. So sánh hai giá trị này và cộng a vào tổng. Dùng long long cho tổng vì n lớn có thể làm tổng vượt 2·10^9. Đạt 20/20 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen("Tinhtong.inp", "r", stdin);
freopen("Tinhtong.out", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long sum = 0;
for (int i = 0; i < n; i++) {
long long a;
cin >> a;
// Chữ số hàng đơn vị là a % 10, chữ số hàng chục là (a / 10) % 10
if (a % 10 > (a / 10) % 10) sum += a;
}
cout << sum << '\n';
return 0;
}
Bình luận