01/10/2018, 00:22

In ra các số hoàn hảo bé hơn N

Chuyện là em có code 1 bài tìm số hoàn hảo bé hơn N , nhập các số nhỏ thì thì nó vẫn in ra các số hoàn hảo bình thường, nhưng nhập số to thì chỉ output ra tới 4 số và chạy không nổi nữa .
Em mới học lập trình nên code còn tù , có ai cho em cách giải quyết không ạ.

#include<iostream>

using namespace std;

int main()
{
    long long  n,sum;
    cout << "Enter your number: "; cin >> n;
    for ( int number = 1;number  <= n;number++)
    {
        sum =0;
        for (int i = 1 ; i <= number;i++)
            if (number%i==0)
                sum+=i;
        if (sum/2.0 == number)
            cout << number << endl;
    }
    return 0;
}
Nguyễn Xuân Phúc viết 02:29 ngày 01/10/2018

5 số hoàn hảo đầu tiên là 6, 28, 496, 8128, 33550336
hiểu lý do vì sao nó chậm rồi ha :3 đơn giản vì nó cực kì hiếm và chẳng có bao nhiêu cả

Newbie viết 02:30 ngày 01/10/2018

vậy có cách nào để xuất được số hoàn hảo trên 4 mà máy có thể chạy nổi không

*grab popcorn* viết 02:27 ngày 01/10/2018

Vì nó ít nên chỉ cần tạo sẵn một mảng ra rồi dò theo N :>

Phước Bá Nguyễn viết 02:32 ngày 01/10/2018

input kiểu long, for thì kiểu int nên nó giới hạn tới 32… kiểu in thôi. sửa code lại thì nó sẽ chạy nổi thôi. chỉ là sẽ chậm. cách hay là như bạn ở trên viết lên mạng search ra rồi tạo mảng so sánh kaka. bao nhanh.

Trung Trường Đàm Nguyễn viết 02:36 ngày 01/10/2018

Bài này bạn có thể cho chạy biến đếm i rồi check nếu 2^i-1 là số nguyên tố thì in ra số hoàn hảo là 2^(i-1)*(2^i-1)

rogp10 viết 02:29 ngày 01/10/2018

Vì đơn giản là cắm đầu chạy từ 1 đến N thì sao mà không lâu

Thực ra bài này không tiêu biểu lắm, nếu hỏi tổng các ước số thì sẽ thuyết phục hơn là hỏi kiểu này (vì lưu mảng cho cùng là vô nghĩa)

Quang Minh viết 02:37 ngày 01/10/2018
bool isPerfectNumber(int n)
{
    int sum = 0;
    for (int i = 1; i <= n/2; i++)
    {
        if (n % i == 0) sum += i;
    }
    return sum == n;
}

Mình đóng góp một thuật toán tối ưu hơn 1 chút nhé

HK boy viết 02:32 ngày 01/10/2018

Thế này vẫn chưa phải là tối ưu, độ phức tạp của thuật của bạn và của bạn thớt đều là O(n) cả.

rogp10 viết 02:36 ngày 01/10/2018

Chưa tối ưu đâu cận có thể xuống tới sqrt(N) và dấn thêm nữa thì không quá sqrt(N) luôn.

p/s: đã “tối ưu” thì không có “hơn”, “tối” là nhất rồi. Tất nhiên có thể chỉnh thêm nữa.

Quang Minh viết 02:33 ngày 01/10/2018

Oki b ^^ m xem lại đã ^^ cảm ơn b nhé ^^

Quang Minh viết 02:28 ngày 01/10/2018

Oki b ^^ :)) edit nhiều quá mình không kịp trả lời :)) đáng lẽ cái đó phải là tốt hơn thôi chứ b nhỉ :))
Thì đây là cách m mới suy nghĩ khi chủ topic đặt vấn đề :)) nên mình sẽ suy nghĩ thêm ^^ cảm ơn b nhé

Bài liên quan
0