Số hoàn hảo

Một phần của tài liệu MỘT SỐ BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG TÁC BỒI DƯỠNG HỌC SINH GIỎI MÔN TIN HỌC BẰNG NGÔN NGỮ LẬP TRÌNH c++ (Trang 29 - 30)

Số hồn hảo (hay cịn gọi là số hoàn chỉnh, số hoàn thiện) là một số nguyên dương mà tổng các ước ngun dương chính thức của nó (số ngun dương bị nó chia hết ngoại trừ nó) bằng chính nó.

Các số sau là số hồn hảo: Số 6 (1 + 2 + 3 = 6)

Số 28 (1 + 2 + 4 + 7 + 14 = 28)

Bài toán cơ bản:

Cho số tự nhiên N. Hãy cho biết N có phải là số hồn hảo hay không?

Dữ liệu vào: Đọc từ tệp SHH.Inp gồm một dòng duy nhất chứa số nguyên

N (1<=n<=109).

Dữ liệu ra: Ghi kết quả ra tệp SHH.Out số 1 nếu N là số hồn hảo, ngược

lại thì ghi số 0. Ví dụ SNT.inp SNT.out 28 1 100 0 Phân tích bài tốn:

Để kiểm tra số nguyên dương N(N>1) có là số hồn hảo khơng, ta tính tổng S tổng các số nguyên i (1<=i<=N-1) mà i là ước của N. Sau đó ta kiểm tra S có bằng N hay khơng. Nếu S=N thì N là số hồn hảo, ngược lại N khơng phải là số hồn hảo.

Xét các số i với i<=√𝑁, ta thấy nếu i là ước của N thỉ thương N/i cũng là ước của N. Do đó, việc tìm ước với k từ 1 đến N- 1 là không cần thiết, mà chỉ cần kiểm tra k từ 1 đến √𝑁. Khi đó, ta có chương trình:

Lưu ý: Trong hàm kiểm tra tính hồn hảo nói trên. Nếu N là số chính

phương thì việc tính tổng các ước thực sự của N là chưa đúng. Vì trong trường hợp này 𝑖 = √𝑁 là ước thì N/i cũng là √𝑁 . vì vậy tổng đã cộng 2 lần √𝑁. Ở đây ta thấy số chính phương khơng bao giờ là số hồn hảo nên tổng khơng phải trừ

√𝑁 kết quả vẫn đúng.

Một phần của tài liệu MỘT SỐ BIỆN PHÁP NÂNG CAO HIỆU QUẢ CÔNG TÁC BỒI DƯỠNG HỌC SINH GIỎI MÔN TIN HỌC BẰNG NGÔN NGỮ LẬP TRÌNH c++ (Trang 29 - 30)