Đề bài: Người dùng nhập n. Hãy tìm các số p, q (0 < p < q < n) sao cho tổng các ước số thực sự của p bằng q và tổng các ước số thực sự của q bằng p. Tìm một thuật toán hiệu quả khi n lớn
Em dùng thuật toán 2 vòng lặp nên nó chạy rất lâu khi n lớn, có ai có ý tưởng thuật toán hiệu quả hơn không ạ?
Bài code của em: https://drive.google.com/open?id=13p_0CnK3XCLs-N-HvPooRbAsvYKLcOGj
#include <stdio.h>
int tongUocSo (int a){
int sum = 0;
for (int i = 1; i < a; i++)
if (a % i == 0) sum += i;
return sum;
}
void cau4(){
int n, flag = 1;
printf("Nhap n: ");
scanf("%d", &n);
for (int i = 1; i < n; i++){
for (int j = i + 1; j < n; j++){
if (tongUocSo(i) == j && tongUocSo(j) == i){
if (i > j){
printf("p = %d\nq = %d\n", j, i);
flag = 0;
} else {
printf("p = %d\nq = %d\n", i, j);
flag = 0;
}
}
}
}
if (flag == 1) printf("Khong ton tai p va q trong khoang 0 toi %d\n", n);
}
int main(){
cau4();
}
Mong cao nhân chỉ giáo. Em cảm ơn.