Bài tập  /  Bài đang cần trả lời

Bờm viết số 293 sau đó tính tổng bình phương các chữ số của số này và lấy kết quả đó thay thế cho số hiện tại: 22 + 92 + 32 = 94. Bờm tiếp tục lặp lại quá trình trên đến khi nhận được số 1 thì dừng: 94 → 97 → 130 → 10 → 1. Bờm gọi những số khi thực hiện quá trình như trên mà kết quả cuối cùng là số 1 là số đặc biệt. Bờm muốn biết trong đoạn [l,r] có bao nhiêu số đặc biệt

Câu 5: Số đặc biệt (PEARL)
Bờm viết số 293 sau đó tính tổng bình phương các chữ số của số này và lấy kết quả đó thay thế cho số hiện tại: 22 + 92 + 32 = 94. Bờm tiếp tục lặp lại quá trình trên đến khi nhận được số 1 thì dừng: 94 → 97 → 130 → 10 → 1. Bờm gọi những số khi thực hiện quá trình như trên mà kết quả cuối cùng là số 1 là số đặc biệt. Bờm muốn biết trong đoạn [l,r] có bao nhiêu số đặc biệt.
Yêu cầu: với mỗi cặp số nguyên l,r (1≤l≤ r ≤1018), xác định số lượng số đặc biệt nằm trong đoạn [l,r].
Dữ liệu: vào từ file văn bản PEARL.INP:
• Dòng đầu chứa số nguyên dương t là số lượng đoạn cần xác định số lượng số đặc biệt;
t dòng tiếp theo, mỗi dòng chứa hai số l, r.
Kết quả: ghi ra file văn bản PEARL.OUT gồm t dòng, mỗi dòng chứa một số nguyên là kết quả tìm được tương ứng.
Ví dụ:
PEARL.INP
PEARL.OUT
1
1
Giới hạn:
2941999 2942002
Có 20% số test có t ≤ 30 và r - l ≤ 106.
Có 20% số test có t ≤ 100; 1 ≤l≤ r ≤ 109.
Có 60% số test có t ≤ 100; 1 ≤l≤ r ≤ 1018.
• làm trong c++
1 Xem trả lời
Hỏi chi tiết
106
Tham khảo câu trả lời từ Trợ lý ảo Lazi
#include
#include

using namespace std;

int specialNumber(long long n) {
while (n != 1 && n != 4) {
long long sum = 0;
while (n > 0) {
int digit = n % 10;
sum += digit * digit;
n /= 10;
}
n = sum;
}
if (n == 1) {
return 1;
} else {
return 0;
}
}

int main() {
ifstream inp("PEARL.INP");
ofstream out("PEARL.OUT");

int t;
inp >> t;

for (int i = 0; i < t; i++) {
long long l, r;
inp >> l >> r;

int count = 0;
for (long long num = l; num <= r; num++) {
count += specialNumber(num);
}

out << count << endl;
}

inp.close();
out.close();

return 0;
}
1
0
cừu
21/02 19:46:22
+5đ tặng
#include <iostream>
#include <unordered_set>

using namespace std;

// Hàm tính tổng bình phương các chữ số của số n
long long tinhTongBinhPhuongChuSo(long long n) {
    long long t />    while (n > 0) {
        int chuSo = n % 10;
        tong += chuSo * chuSo;
        n /= 10;
    }
    return tong;
}

// Hàm kiểm tra xem một số có phải là số đặc biệt hay không
bool laSoDacBiet(long long n) {
    unordered_set<long long> daXuatHien;
    while (n != 1 && daXuatHien.find(n) == daXuatHien.end()) {
        daXuatHien.insert(n);
        n = tinhTongBinhPhuongChuSo(n);
    }
    return n == 1;
}

int main() {
    freopen("PEARL.INP", "r", stdin);
    freopen("PEARL.OUT", "w", stdout);

    int soLuongTest;
    cin >> soLuongTest;

    while (soLuongTest--) {
        long long l, r;
        cin >> l >> r;
        
        int demSoDacBiet = 0;
        for (long long i = l; i <= r; ++i) {
            if (laSoDacBiet(i)) {
                demSoDacBiet++;
            }
        }

        cout << demSoDacBiet << endl;
    }

    return 0;
}
 

Mở khóa để xem toàn bộ nội dung trả lời

(?)
Bạn đã đạt đến giới hạn của mình. Bằng cách Đăng ký tài khoản, bạn có thể xem toàn bộ nội dung trả lời
Cải thiện điểm số của bạn bằng cách đăng ký tài khoản Lazi.
Xem toàn bộ các câu trả lời, chat trực tiếp 1:1 với đội ngũ Gia sư Lazi bằng cách Đăng nhập tài khoản ngay bây giờ
Tôi đã có tài khoản? Đăng nhập

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường
×
Trợ lý ảo Trợ lý ảo
×
Đấu trường tri thức | Lazi Quiz Challenge +500k
Gửi câu hỏi
×