BÀI TẬP Ở NHÀ

https://baitaponha.com

Số anh em | Câu 1 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015

Đây là câu số 1 trong bộ đề thi học sinh giỏi tin 11 của tỉnh Nghệ An năm học 2014 - 2015. Đây là bài tương đối dễ kiếm điểm, đề dễ hiểu, giải thích tường minh. Việc còn lại của các bạn là xử lý code theo yêu cầu đề bài. Đây là câu 1 nên dữ liệu vào cũng là số nhỏ (104).
SỐ ANH EM
Bài 1. (5 điểm)  Số anh em                                                                
Ước thực sự của số tự nhiên N là ước khác 1 và chính nó. Hai số được gọi là anh em nếu chúng có tổng các ước thực sự bằng nhau.
Ví dụ: 6 và 25 được gọi là hai số anh em vì các ước thực sự của 6 là 2 và 3 có tổng bằng 5 và các ước thực sự của 25 là 5 có tổng là 5.
Yêu cầu: Viết chương trình để kiểm tra hai số có phải là hai số anh em không?
Dữ liệu vào từ file văn bản ANHEM.INP: Chỉ gồm một dòng duy nhất chứa hai số nguyên dương M, N (0 < M, N < 104) cách nhau ít nhất một ký tự trống.
Kết quả ghi file văn bản ANHEM.OUT: Chỉ một dòng duy nhất chứa xâu ‘YES’ nếu M, N là hai số anh em, ngược lại ghi ra xâu ‘NO’.
Ví dụ:
ANHEM.INP ANHEM.OUT ANHEM.INP ANHEM.OUT
6  25 YES 12  13 NO

Giải.

Đề làm bài này thì chúng ta chỉ cần viết một hàm kiểm tra tính anh em của hai số M và N là xong ha. Để kiểm tra hai số có phải là anh em hay không thì điều tất nhiên là ta phải tìm toàn bộ các ước thực sự của M và N rồi tính tổng của chúng và so sánh thôi ha.

Code mẫu bằng Pascal.

const   fi = 'ANHEM.INP';
        fo = 'ANHEM.OUT';

VAR     i,j,m,n:word;
        f1, f2: text;
procedure doctep;
Begin
        assign(f1,fi); reset(f1);
        assign(f2,fo);rewrite(f2);
        read(f1,m,n);
end;
FUNCTION KTAE(x,y:word):Boolean;
var     i,j:word;
        sx,sy:longint;
    ok:boolean;
BEGIN
    Sx:=0; Sy:=0;
    For i:=2 to trunc(x div 2) do if x mod i = 0 then Sx:=Sx+i;
    For j:=2 to trunc(y div 2) do if y mod j = 0 then Sy:=Sy+j;
    If (Sx = Sy) and (sx>0) Then ok:=TRUE ELSE ok:=FALSE;
    KTAE:=ok;
END;
procedure xuly;
begin
        If KTAE(m,n)=TRUE then
        write(f2,'YES') else write(f2,'NO');
end;
procedure dongtep;
begin
        close(f1);
        close(f2);
end;
BEGIN
        doctep;
        xuly;
        dongtep;
END.

Ngoài ra các bạn có thể tham khảo thêm các sử dụng Python:

Code sau mình không đọc và ghi dữ liệu từ file nhé, các bạn tự nhập, còn bạn nào cần thì cữ bổ sung vào là ok. 

def sum_proper_divisors(n):
    return sum(i for i in range(1, n) if n % i == 0)

def are_amicable_numbers(m, n):
    return sum_proper_divisors(m) == sum_proper_divisors(n)

m, n = map(int, input().split())
if are_amicable_numbers(m, n):
    print("YES")
else:
    print("NO")
Vì đề ra cho M, N <= 104 nên vòng lặp for ta cho chạy tới n luôn ha. Tuy nhiên nếu cần thiết thì ta cũng có thể chỉ cho chạy tới phần nguyên căn bậc hai của n. Cách làm giông như bài "Sô không hoàn hảo" --> Các bạn có thể tham khảo tại đấy: https://baitaponha.com/giai-de-tin-hoc/cau-1-so-khong-hoan-hao-de-thi-hsg-tinh-lop-12-nam-hoc-2022-2023-32.html

Tác giả: admin

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây