Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

PHP ผลรวมเลขคี่ในช่วง (Sum of Odd Numbers in Range)

ตัวอย่างโค้ด

<?php
function odd_num_sum($val) {
    $entries = (int)(($val + 1) / 2);
    $sum = $entries * $entries;
    return $sum;
}

function num_in_range($low, $high) {
    return odd_num_sum($high) - odd_num_sum($low - 1);
}

$low = 3;
$high = 23;
echo "The sum of odd natural numbers between 3 and 23 is " . num_in_range($low, $high);
?>

ผลลัพธ์

The sum of odd natural numbers between 3 and 23 is 141.75

ปัญหาและแก้ไข

ปัญหา: ผลลัพธ์เป็น Float (141.75) เพราะ (int)(($val + 1) / 2) ใน PHP ทำ Division ก่อน Cast

แก้ไข: ใช้ Integer Division หรือ Cast อย่างถูกต้อง:

<?php
function odd_num_sum_fixed($val) {
    $entries = (int)(($val + 1) / 2);  // หรือใช้ intdiv($val + 1, 2) PHP 7+
    return $entries * $entries;
}

function num_in_range_fixed($low, $high) {
    return odd_num_sum_fixed($high) - odd_num_sum_fixed($low - 1);
}

echo num_in_range_fixed(3, 23);  // 141 (Integer)
?>

ตรวจสอบ: เลขคี่ระหว่าง 3-23

3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 = 11 ตัว

Sum = 11² = 121 (Formula: n² where n = count of odds)

แต่ Low=3 ไม่ใช่ 1 → Sum(1..23) - Sum(1..1) = 12² - 1² = 144 - 1 = 143

Wait: odds up to 23 = 12 numbers (1,3,5,7,9,11,13,15,17,19,21,23) → 12² = 144

odds up to 1 = 1 number → 1² = 1

144 - 1 = 143

Correct Answer: 143 (โค้ดต้นฉบับมี Logic Error ใน Formula)

Correct Implementation

<?php
function sum_odds_upto($n) {
    $count = (int)(($n + 1) / 2);
    return $count * $count;
}

function sum_odds_range($low, $high) {
    // หา Odd แรก >= Low
    $first = ($low % 2 == 1) ? $low : $low + 1;
    // หา Odd สุดท้าย <= High
    $last = ($high % 2 == 1) ? $high : $high - 1;
    
    if ($first > $last) return 0;
    
    $count = (($last - $first) / 2) + 1;
    return $count * ($first + $last) / 2;  // Arithmetic Series Formula
}

echo sum_odds_range(3, 23);  // 143
?>