In Ra Các Số Hoàn Hảo Bé Hơn N - Dạy Nhau Học Trang chủ » Số Hoàn Hảo Bằng C++ » In Ra Các Số Hoàn Hảo Bé Hơn N - Dạy Nhau Học Có thể bạn quan tâm Số Hoàn Hảo C Số Hoàn Hảo Chẵn Số Hoàn Hảo Chính Phương Số Hoàn Hảo C++ Là Gì Số Hoàn Hảo Là Gì In ra các số hoàn hảo bé hơn N programming c++ banbanga12345 (Newbie) October 9, 2016, 10:29am #1 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; } nxphuc (Nguyễn Xuân Phúc) October 9, 2016, 10:31am #2 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ả 1 Like banbanga12345 (Newbie) October 9, 2016, 10:37am #3 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 drgnz (Drgnz) October 9, 2016, 11:02am #5 Vì nó ít nên chỉ cần tạo sẵn một mảng ra rồi dò theo N :> 3 Likes Phuoc_Ba_Nguyen (Phước Bá Nguyễn) October 9, 2016, 3:38pm #6 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. TrungTruong (Trung Trường Đàm Nguyễn) October 19, 2017, 9:16am #7 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) 2 Likes rogp10 (rogp10) October 19, 2017, 9:52am #8 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) 1 Like minh99 (Quang Minh) October 19, 2017, 2:43pm #9 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é noname00 (HK boy) October 19, 2017, 2:52pm #10 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ả. 1 Like rogp10 (rogp10) October 19, 2017, 3:05pm #11 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. 3 Likes minh99 (Quang Minh) October 19, 2017, 3:10pm #12 Oki b ^^ m xem lại đã ^^ cảm ơn b nhé ^^ minh99 (Quang Minh) October 19, 2017, 3:04pm #13 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é Tien_Trien_Nguyen (Tien Trien Nguyen) May 1, 2021, 6:59pm #14 Không biết là còn bác nào quan tâm không, nhưng mà mình có cái code chạy O(nlogn). #include <bits/stdc++.h> using namespace std; long long n, tmp, tmp2, sang[100009], nt[100009], S[100009], vt=0, kq[10]; int main(){ cin>>n; fill(sang+2, sang+n+1, 1); for(long long i=2; i<=n; i++){ if(sang[i]){ for(long long j=i*i; j<=n; j+=i) sang[j]=0; vt++; nt[vt]=i; } } for(long long i=2; i<=n; i++){ if(sang[i]){ S[i]=i+1; continue; } for(long long j=1; nt[j]<=sqrt(i); j++){ if(i%nt[j]==0){ tmp=i; tmp2=1; while(tmp%nt[j]==0){ tmp/=nt[j]; tmp2*=nt[j]; } if(tmp==1) S[i]=(i*nt[j]-1)/(nt[j]-1); else S[i]=S[tmp]*S[tmp2]; break; } } } S[0]=0; vt=0; for(long long i=6; i<=n; i++) if(S[i]==2*i) cout<<i<<endl; return 0; } noname00 (HK boy) March 7, 2021, 6:03pm #15 Có thể code trong O(1) mà Code của bạn là O(n \pi(\sqrt{n})), không phải O(n log n). 2 Likes PrinceOfWales (Đoàn Đại Dương) May 23, 2021, 8:21am #16 hoặc bạn có thể chạy từ 2 đến sqrt(n) :))) 1 Like Hoang_Vu_Huy (Vũ Huy Hoàng) May 23, 2021, 11:00am #17 Có công thức luôn nè bro https://vi.m.wikipedia.org/wiki/Số_hoàn_thiện#:~:text=Số%20hoàn%20thiện%20(hay%20còn,trừ%20nó)%20bằng%20chính%20nó. 2 Likes newwbiee (11) October 10, 2021, 1:57am #19 giải thích cho e chỗ sum chia 2 đc ko ạ rogp10 (rogp10) October 10, 2021, 2:24am #20 Định nghĩa là ước số không tính n mà cộng lại bằng n. Để ý code #1 + thêm n nên phải so sánh sum với 2*n (viết như trên là sai, vì sao ) . Thực ra code đó ko hay, bạn đọc thêm mấy reply ấy. 1 Like DayNhauHoc's Discord Học C++ Free? Click Blog Dạy Nhau Học Tự Học Lập Trình 83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao? Từ khóa » Số Hoàn Hảo Bằng C++ Kiểm Tra Số Hoàn Hảo Trong C++ Kiểm Tra Số Hoàn Hảo Trong Lập Trình C/C++ [C++] Số Hoàn Hảo Cách Kiểm Tra Số Hoàn Hảo Bằng Code C/C++ - Lập Trình Không Khó Thuật Toán Kiểm Tra Số Hoàn Hảo Trong C++ - Freetuts C++ - Số Hoàn Hảo - YouTube Cách Kiểm Tra Số Hoàn Hảo Trong Lập Trình C/C++ Viết Chương Trình In Ra Các Số Hoàn Hảo C++ - Hỏi Đáp [C++] Số Hoàn Hảo - Kiến Thức 24h Viết Chương Trình Kiểm Tra Số N Có Phải Là Số Hoàn Thiện Không? Kiểm Tra Một Số Có Phải Là Số Hoàn Hảo Hay Không Trong C/C++? Bài Tập C++: Tìm Số Những Số Hoàn Hảo <1000000 - Cộng đồng C Việt Tìm Số Hoàn Hảo Từ 1 đến N