Đề 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.
      
    
 do tổng ước có nhân tính (multiplicative) với các số nguyên tố cùng nhau.
 phân tích thừa số nguyên tố là phép nhân mà làm sao thành tổng vậy anh
 rồi xong.
 nhưng mà trong sáng hơn nhoa :V
 (page size)

 Tối rồi em đi ngủ đây, chúc anh ngủ ngon :v
    83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?