ตัวอย่างโค้ด
<?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
?>