Cặp số hữu nghị: Giải quyết bài toán với Pascal, C++ và Python

Bài toán: Hai số tự nhiên A, B được coi là hữu nghị nếu như số này bằng tổng các ước số của số kia và ngược lại. Lập trình tìm và chiếu lên màn hình các cặp số hữu nghị trong phạm vi từ 1 đến 10000. (Lưu ý: số 1 được coi là ước số của mọi số còn mỗi số không được coi là ước số của chính nó).

Lời giải:

Để giải quyết bài toán này, chúng ta cần xác định các ước số của mỗi số trong phạm vi từ 1 đến 10000, sau đó kiểm tra xem hai số có bằng tổng các ước số của nhau hay không. Ta có thể lặp qua từng số trong phạm vi và thực hiện các bước kiểm tra như sau:

Code Python: 

for i in range(1, 10001):
    divisors = []  # Danh sách các ước số của số i
    for j in range(1, i):
        if i % j == 0:
            divisors.append(j)
    # Kiểm tra nếu tổng các ước số của i bằng j và ngược lại
    if sum(divisors) == j and sum([x for x in range(1, j) if j % x == 0]) == i:
        print(f"{i} và {j} là cặp số hữu nghị")

Lưu ý rằng trong bài toán này, chúng ta không xem xét số 1 là ước số của chính nó và cần sử dụng phép tính sum([x for x in range(1, j) if j % x == 0]) để tính tổng các ước số của số j.

Đoạn code trên sẽ in ra tất cả các cặp số hữu nghị trong phạm vi từ 1 đến 10000.

Dưới đây là đoạn code C++ để giải quyết bài toán tìm các cặp số hữu nghị trong phạm vi từ 1 đến 10000:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    for (int i = 1; i <= 10000; i++) {
        vector<int> divisors; // Danh sách các ước số của số i
        for (int j = 1; j < i; j++) {
            if (i % j == 0) {
                divisors.push_back(j);
            }
        }
        int sum_divisors = 0;
        for (int divisor : divisors) {
            sum_divisors += divisor;
        }
        // Kiểm tra nếu tổng các ước số của i bằng j và ngược lại
        if (sum_divisors == j && accumulate(begin(divisors), end(divisors), 0,
            [](int acc, int divisor) { return acc + ((divisor == 1) ? 0 : divisor); }) == i) {
            cout << i << " và " << j << " là cặp số hữu nghị" << endl;
        }
    }
    return 0;
}

Lưu ý rằng chúng ta cũng không xem xét số 1 là ước số của chính nó trong bài toán này. Trong đoạn code trên, chúng ta sử dụng hàm push_back để thêm phần tử vào cuối của vector và hàm accumulate để tính tổng các phần tử trong vector (được áp dụng cho việc tính tổng các ước số của số j).

Dưới đây là đoạn code Pascal để giải quyết bài toán tìm các cặp số hữu nghị trong phạm vi từ 1 đến 10000:

program TimCapSoHuuNghi;

var
  i, j, divisor, sum_divisors: integer;
  divisors: array of integer;

begin
  for i := 1 to 10000 do
  begin
    SetLength(divisors, 0);
    // Tìm các ước số của số i
    for j := 1 to i-1 do
    begin
      if i mod j = 0 then
      begin
        SetLength(divisors, Length(divisors)+1);
        divisors[Length(divisors)-1] := j;
      end;
    end;
    sum_divisors := 0;
    // Tính tổng các ước số của số i
    for divisor in divisors do
    begin
      sum_divisors := sum_divisors + divisor;
    end;
    // Kiểm tra nếu tổng các ước số của i bằng j và ngược lại
    if (sum_divisors = j) and (Sum(x -> if x = 1 then 0 else x, divisors) = i) then
    begin
      writeln(i, ' và ', j, ' là cặp số hữu nghị');
    end;
  end;
end.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *