VL13 - Kiểm tra số hoàn hảo

Xem dạng PDF

Gửi bài giải


Điểm: 1,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Go, Java, Pascal, Perl, PHP, PyPy, Python, Ruby, Rust, Scratch, Swift

Số hoàn hảo (số hoàn thiện) là một số nguyên dương mà tổng các ước nguyên dương của nó (không bao gồm ước lớn nhất) bằng chính nó.

Ví dụ:

~ 6 = 1 + 2 + 3 ~ là một số hoàn hảo.

Nhiệm vụ của bạn là viết chương trình kiểm tra 1 số nguyên nhập từ bàn phím có phải số hoàn hảo hay không!

Input

  • Số nguyên ~n~ cần kiểm tra

Giới hạn

  • ~|n| \le 10^9~

Output

  • In ra YES nếu ~n~ là số hoàn hảo
  • In ra NO nếu ~n~ không phải số hoàn hảo

Sample

Input #1
6
Output #1
YES

Bình luận

Please read the guidelines before commenting.



  • 0
    nl4513012  đã bình luận lúc 30, Tháng 4, 2026, 9:57

    test 4 la gi ay mn


  • 0
    mducc  đã bình luận lúc 25, Tháng 4, 2026, 12:49

    spoil! ý tưởng:

    tính tổng ước bằng cách duyệt đến căn bậc 2 của n bởi |n| <= 1e9 vượt quá dưới hạn của sàng ước 
    sau đó chỉ cần check tổng có bằng 2*n không là được 
    biến đổi: 
       sum - n = n 
    => sum = 2*n
    

    code tham khảo (c++)

        #include <bits/stdc++.h>
    
        using namespace std;
    
        int main() {
            ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    
            long long n;
            cin >> n;
            long long sum = 0;
            for (int i = 1; i <= sqrt(n); ++i) {
                if (n % i == 0) {
                    sum += i;
                    if (i != n / i) sum += n / i;
                }
            }
            if (sum == 2*n) cout << "YES";
            else cout << "NO";
        }
    

  • 0
    kietjumper  đã bình luận lúc 19, Tháng 1, 2026, 15:42

    Sao n <= 10^9 mà mn duyệt trâu tìm ước không bị TLE ạ?


  • 0
    maxkhanhminh  đã bình luận lúc 18, Tháng 1, 2026, 6:19
    • n = int(input()) y = [] for i in range(1, n): if n % i == 0: y.append(i) if sum(y) == n: print("YES") else: print("NO")

    • 0
      minhlong180714  đã bình luận lúc 18, Tháng 1, 2026, 13:05

      ko được


      • 0
        dichtuongmotul  đã bình luận lúc 3, Tháng 5, 2026, 10:00

        include <bits/stdc++.h>

        define ll long long

        using namespace std; ll n,s=0; int main() { cin>>n; for(ll i=1;i<=n;i++){ if(n%i==0){ s+=i; } }if(s-n==n) cout << "YES"; else cout << "NO";

        return 0;
        

        }


  • 0
    nguyenkevu  đã bình luận lúc 4, Tháng 12, 2025, 1:34

    code này sai ở đâu v ạ

    include <bits/stdc++.h>

    using namespace std;

    int main() { int n; cin >> n;

    if (n <= 1) {
        cout << "No" << endl;
        return 0;
    }
    
    int dapan = 0;
    for (int i = 1; i < n; i++) {
        if (n % i == 0) {
            dapan += i;
        }
    }
    
    if (n == dapan) {
        cout << "Yes" << endl;  // n là số hoàn hảo
    } else {
        cout << "No" << endl;
    }
    return 0;
    

    }


    • 0
      dichtuongmotul  đã bình luận lúc 3, Tháng 5, 2026, 10:04 chỉnh sửa

      đổi int của for sang long long ik

      include <bits/stdc++.h>

      define ll long long

      using namespace std; ll n,s=0; int main() { cin>>n; for(ll i=1;i<=n;i++){ if(n%i==0){ s+=i; } }if(s-n==n) cout << "YES"; else cout << "NO";

      return 0;
      

      }


  • 0
    anloc5616  đã bình luận lúc 11, Tháng 11, 2025, 9:45

    include <bits/stdc++.h>

    using namespace std; long long n; int main() { cin >> n; int L = 0; for (int i = 1; i < n; i++) { if (n % i == 0) { L += i; } }

    if (L == n)
        cout << "YES";
    else
        cout << "NO";
    
    return 0;
    

    }


  • 0
    mitgsut2007  đã bình luận lúc 7, Tháng 11, 2025, 15:37

    test 5 là test n<0 nha mn :3


  • 0
    ThanhPhan_UTC  đã bình luận lúc 6, Tháng 11, 2025, 19:25

    include<bits/stdc++.h>

    using namespace std;

    bool check(int n){ if(n <= 1){ return false; } int tong = 0; for(int i = 1; i < n; i++){ if( n % i == 0 ) tong += i; } return tong == n; }

    int main(){ int n; cin >> n;

    if(check(n)){
        cout << "YES";
    }
    else 
        cout << "NO";
    

    }


  • 0
    crazychessgambit  đã bình luận lúc 2, Tháng 11, 2025, 7:32
    // Kiểm tra số hoàn hảo https://luyencode.net/problem/vl13
    
    #include <iostream>
    using namespace std;
    
    long long sumUocSoPF(int n);
    bool checkSoHoanHao(int n);
    
    int main(){
        int n;
        cin >> n;
        cout << (checkSoHoanHao(n) ? "YES" : "NO");
        return 0;
    }
    
    long long sumUocSoPF(int n){
        // 6=1+2+3
        int s = 0;
        for(int i=1; i&lt;n; i++){
            if(n%i==0){
                s += i;
            }
        }    
        return s;
    }
    
    bool checkSoHoanHao(int n){
        return n == sumUocSoPF(n);
    }
    

  • -1
    0988440189  đã bình luận lúc 20, Tháng 6, 2025, 14:53

    Lưu ý trường hợp n=1 nhé ae MU


  • 0
    Minhsang1  đã bình luận lúc 29, Tháng 3, 2025, 8:51

    nếu n <=10^18 thì nên làm như nào các bạn nếu đc cho mk xin code


  • -1
    dtdat160314  đã bình luận lúc 15, Tháng 1, 2025, 1:00 chỉnh sửa

    xin chao các bạn


  • -3
    tngnghi250315  đã bình luận lúc 22, Tháng 12, 2024, 7:51

    khos quas


  • -3
    danglephuong  đã bình luận lúc 4, Tháng 12, 2024, 9:13

    khó quá các bạn ơi!


  • -1
    kietjumper  đã bình luận lúc 4, Tháng 11, 2024, 16:14 chỉnh sửa

    .


  • -3
    holecuong  đã bình luận lúc 6, Tháng 3, 2024, 21:44

    nguyên nhân gì xin các bạn chia sẽ giúp mình với


  • -2
    hailuacx  đã bình luận lúc 12, Tháng 1, 2024, 16:29

    Sai ở vòng for. for(ll i=2;i<=n;i++) là bạn lấy cả ước n luôn rồi.


  • -2
    khnguyen21th06  đã bình luận lúc 3, Tháng 12, 2023, 14:56

    ai code bài này AC bằng c++ cho mình xin code với, cứ bị TLE quài á


  • -1
    hieuthuba1907  đã bình luận lúc 27, Tháng 12, 2023, 7:27

    <bits/stdc++.h> là thư viện chuẩn có chứa cả <iostream> rồi bn nhé!


  • -3
    tungkq123  đã bình luận lúc 28, Tháng 11, 2023, 9:08

    đọc đề nhầm tý là out luôn =))


  • -4
    Yorickur  đã bình luận lúc 22, Tháng 7, 2023, 16:12

    dạ cho mình hỏi code mình sai chỗ nào vậy ạ, mình bị sai ngay test case đầu tiên luôn bool hoanthien(int n) { int temp = 1; for (int i = 2; i <= sqrt(n); i++) { if (n % i == 0) { temp += i; if (i != n / i) { temp += n / i; } } } return temp == n; }


    • -3
      lch101  đã bình luận lúc 22, Tháng 7, 2023, 19:43

      Thứ nhất: tại i = 1. thì temp += 1 && tmp += n như này đã vi phạm đoạn tính ước là chính nó. Thứ 2: Bạn thiếu case n = 1 thì nó không phải là số hoàn hảo nhé vì shh không bao gồm ước là chính nó.


  • 0
    yoonicornsyndrome  đã bình luận lúc 12, Tháng 7, 2023, 19:37

    cho em hỏi test case 5 là gì v ạ?


    • -2
      hoangnguyenn268  đã bình luận lúc 14, Tháng 7, 2023, 5:42

      Mình nghĩ là liên quan kiểu dữ liệu ấy. Y/c 10^9 lận