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

Thứ sáu - 19/05/2023 17:39 2.217 0
Đâ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
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

Nếu thấy hữu ích, xin đừng tiếc cho tôi xin một ĐĂNG KÝ KÊNH và một LIKE. Xin cảm ơn!

Hình ảnh

File đính kèm

Tác giả: admin

Tổng số điểm của bài viết là: 5 trong 1 đánh giá

Xếp hạng: 5 - 1 phiếu bầu

  Ý kiến bạn đọc

Top điểm cao
  • 9.6
    Quản Lý KSCL
    KSCL TIẾNG ANH 9
  • 8.8
    Quản Lý KSCL
    KSCL TIẾNG ANH 9
  • 8.8
    Quản Lý KSCL
    KSCL TIẾNG ANH 9
  • 6.8
    Quản Lý KSCL
    KSCL TIẾNG ANH 9
  • 0.8
    Nguyễn Đức Lưu
    Toán 6
Xem nhiều nhất
Thành viên
Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site

Đăng nhập thông qua Google
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