Đề: Nhập n vào từ bàn phím
KQ: in ra tổng các ước số nhỏ hơn n(Trừ n)
Em làm như vậy mà bị lỗi thời gian ko đúng so với quy định :(( Cao nhân nào có ý kiến gì thì giúp em với ạ!
#include <iostream>
using namespace std;
int main()
{
int n, s = 0;
cin >> n;
for (int i = 1; i < n; i++)
if (n%i == 0)
s = s + i;
cout << s;
return 0;
}
> #include <iostream>
> #include <math.h>
> using namespace std;
> int main()
> {
> int n, s = 0;
> cin >> n;
> for (int i = 1; i <= sqrt(n); i++)
> if (n%i == 0)
> s += (i + n / i);
> cout << s;
> return 0;
> }
Đây ạ. Chạy tới căn n. Nhưng nó vẫn tính luôn n trong đó :((
Nếu n chính phương thì phải trừ lại đó thôi thì ghi i < sqrt(n) rồi xét riêng.
Để không dính n thì chạy từ 2 lên rồi khởi tạo s = 1.
Câu này ko chuẩn thực ra nó ntn:
Với mọi hợp số luôn có d | n sao cho 1 < d < n. Nếu 1 < d <= sqrt(n) thì không nói gì. Ngược lại, n > d > sqrt(n) <=> 1/n < 1/d < 1/sqrt(n) <=> 1 < n/d < n/sqrt(n) = sqrt(n). Mà d | n vậy n/d là số nguyên (tính chất phép chia) và (n/d) | n.
Hay nói cách khác, d với n/d là một cặp và một trong hai không vượt quá sqrt(n). Vậy mới ổn.
#include <iostream>
using namespace std;
int main() {
int n, s = 0;
int pre = 1;
cin >> n;
for (int i = 2; i < n / 2; i++) {
while (n % i == 0) {
n = n / i;
pre = pre * i;
sum = sum + pre;
}
}
if (n == i && sum > pre) {
sum = sum - pre;
}
cout << s;
return 0;
}
Bài toán có hiệu quả khi n lớn. Vậy nên nếu muốn chơi bời hơn thì có thể như sau:
#include <iostream>
using namespace std;
int main() {
int n = 0;
int sum = 0;
cin >> n;
if (n > 2*2*2*2*2) {
sum = blad(n);
} else {
sum = bladblad(n);
}
if (n == i && sum > pre) {
sum = sum - pre;
}
cout << s;
return 0;
}
int blad (int n) {
int sum = 0;
int pre = 1;
cin >> n;
for (int i = 2; i < n / 2; i++) {
while (n % i == 0) {
n = n / i;
pre = pre * i;
sum = sum + pre;
}
}
if (n == i && sum > pre) {
sum = sum - pre;
}
return sum
}
int bladblad (int n) {
int sum = 0;
for (int i = 2; i < n / 2; i++) {
if (n % i == 0) {
sum = sum + i;
}
}
return sum;
}
Câu hỏi là tổng đó có cấp nhận số 1 không? Đang mặc định là anh không lấy số 1 còn em thì có.
Anyway là bài này đúng là phải phân tích ra thừa số nguyên tố mà quên mất thuật toán đó rồi nên em tự tìm lại thuật toán đó nhé. Cơ mà có lẽ dùng cách này sẽ nhanh hơn thì phải.
Vẫn sqrt(n) được. Chỉ cần xét sau cùng n có bằng 1 không.
Nếu n bằng 1 thì thừa số cuối cùng có số mũ > 1, vì ta biết rõ chia đến sqrt() là đủ. (và ngược lại)
Nếu n khác 1 thì rõ ràng ta vừa chạy xong test cho n, vậy n nguyên tố.