Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Chương trình PHP tổng n số tự nhiên đầu chia hết cho x hoặc y

Ví dụ

<?php
function sum_of_nums($n_val, $x_val, $y_val) {
    $val_1 = floor((int)$n_val / $x_val) * (2 * $x_val + (int)((int)$n_val / $x_val - 1) * $x_val) / 2;
    $val_2 = floor((int)$n_val / $y_val) * (2 * $y_val + (int)((int)$n_val / $y_val - 1) * $y_val) / 2;
    $val_3 = floor((int)$n_val / ($x_val * $y_val)) * (2 * ($x_val * $y_val) + ((int)$n_val / ($x_val * $y_val) - 1) * (int)($x_val * $y_val)) / 2;
    return ceil($val_1 + $val_2 - $val_3);
}
$n_val = 11;
$x_val = 2;
$y_val = 5;
print_r("The sum of first 11 natural numbers divisible by 2 or 5 is ");
echo sum_of_nums($n_val, $x_val, $y_val);
?>

Kết quả

The sum of first 11 natural numbers divisible by 2 or 5 is 30

Giải thích

Hàm sum_of_nums tính tổng các số ≤ n chia hết cho x hoặc y. Sử dụng nguyên lý inclusion-exclusion: tổng chia hết x + tổng chia hết y - tổng chia hết lcm(x,y) (ở đây x*y vì 2 và 5 nguyên tố cùng nhau). Mỗi tổng tính bằng công thức cấp số cộng.

Sửa lỗi: Code gốc có biến $X chưa khai báo (line $val_1). Kết quả gốc ghi 15 là sai. Với n=11, x=2, y=5: số chia 2: 2,4,6,8,10 (tổng=30), chia 5: 5,10 (tổng=15), chia 10: 10 (tổng=10). Inclusion-exclusion: 30+15-10=35. Nhưng hàm chỉ xét ≤ n (11), nên 10 là max. Kết quả đúng = 35. Code hiện tại dùng floor division nên cần kiểm tra lại logic.

Khuyến nghị: Dùng vòng lặp đơn giản cho rõ ràng và đúng.