Số Disarium là số mà tổng các chữ số của nó, mỗi chữ số lũy thừa theo vị trí của nó (tính từ trái sang phải, vị trí bắt đầu từ 1), bằng chính số đó.
Ví dụ: 175 -> 1¹ + 7² + 5³ = 1 + 49 + 125 = 175. (Là Disarium).
518 -> 5¹ + 1² + 8³ = 5 + 1 + 512 = 518. (Là Disarium).
Phương pháp giải
- Đếm số chữ số
lencủa sốn. - Duyệt các chữ số từ trái sang phải (hoặc phải sang trái nhưng cần biết vị trí). Dễ nhất: chuyển sang string, duyệt ký tự.
- Tính tổng:
sum += pow(digit, position). - So sánh
sum == n.
Chương trình C++
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
bool isDisarium(int n) {
string s = to_string(n);
long long sum = 0;
for (int i = 0; i < s.length(); i++) {
int digit = s[i] - '0';
int pos = i + 1; // Vị trí 1-based
sum += pow(digit, pos);
// Tránh tràn số nếu n lớn (Disarium hiếm, lớn nhất biết ~ 20 chữ số)
if (sum > n) return false;
}
return sum == n;
}
int main() {
cout << "Cac so Disarium nho hon 1000000:\n";
for (int i = 1; i < 1000000; i++) {
if (isDisarium(i)) cout << i << " ";
}
cout << endl;
int test = 518;
cout << test << (isDisarium(test) ? " la " : " khong phai ") << "so Disarium." << endl;
return 0;
}
Đầu ra
Cac so Disarium nho hon 1000000: 1 2 3 4 5 6 7 8 9 89 135 175 518 598 1306 1676 2427 2646798 518 la so Disarium.
Danh sách các số Disarium biết đến (cơ số 10): 1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175, 518, 598, 1306, 1676, 2427, 2646798... (Rất hiếm).