PHP හි අනවශ්‍ය අරාවන් ප්‍රශස්ත කිරීම

තැනක් හිටියොත්, යම් ක්‍රමලේඛකයෙකුට කර්තව්‍යයක් ඇත 1 සිට 100000000 දක්වා පූර්ණ සංඛ්‍යාවල එකතුව සොයා ගැනීම.

අපගේ ක්‍රමලේඛකයා මෙම කාර්යය සඳහා සරල විසඳුමක් ලිව්වේ, මෙසේය:

php<?php
  echo array_sum(range(1, 100000000));
?>

සුන්දර විසඳුමක්, නේද? එක පේලියකින් හා සියල්ල එසේම. නමුත් එය ක්‍රියාත්මක නොවේ! උත්සාහ කරන්න මෙම කේතය ක්‍රියාත්මක කරන්න, එය තිරය මත ප්‍රදර්ශනය කරයි දෝෂයක් ඔබ ඉල්ලා සිටියේ බව අනවශ්‍ය මතකයක්.

හ්ම්, 100000000 එතරම් විශාල නොවේද? නැතහොත් විශාලද? අපි ගණන් කරමු. ශ්‍රිතය range 100000000 සංඛ්‍යා සහිත අරාවක් සාදයි. PHP සංඛ්‍යාවක් සඳහා 2 බයිට් වෙන් කරයි - එවිට අපගේ අරාව ගබඩා කිරීමට අවශ්‍ය වේ 200000000 බයිට්, එනම් ආසන්න වශයෙන් 200 මෙගාබයිට් මතකය.

නමුත් ඇත්ත වශයෙන්ම, වැඩි මතකයක් අවශ්‍ය වේ PHP හි අරාවක් ගබඩා කිරීමේදී ඉතා බොහෝ දුරට වැඩි පිරිවැය හේතුවෙන්. උදාහරණයක් ලෙස, මගේ දෝෂ පණිවුඩයේ දක්වා ඇත්තේ, මම 4294967304 වෙන් කිරීමට උත්සාහ කරන බව බයිට් - ආසන්න වශයෙන් 4 ගිගාබයිට්!

දෝෂය ඇති වන්නේ මන්දැයි දැන් පැහැදිලිය - අපි අවසර දී ඇති මතක සීමාව ඉක්මවා ගියෙමු.

අපගේ ස්ක්‍රිප්ට් එක වෙනත් එකකට නැවත ලිවීම එතරම් අපහසු නැත, ප්‍රායෝගිකව මතකය භාවිතා නොකරන:

php<?php
  $sum = 0;
  
  for ($i = 1; $i <= 100000000; $i++) {
    $sum += $i;
  }
  
  echo $sum;
?>

තවද ගණිතමය විසඳුම භාවිතා කිරීම වඩා හොඳය:

php<?php
  $n = 1000000;
  $sum = $n * ($n + 1) / 2;
  echo $sum;
?>
Задание 1

යම් ක්‍රමලේඛකයෙකුට කර්තව්‍යයක් තිබුණි දී ඇති සංඛ්‍යාවක කාරකය සොයා ගැනීම. ඔහු එය පහත පරිදි විසඳුවේය:

php<?php
  $n = 100;
  echo array_product(range(1, $n));
?>

මෙම කේතයේ ඇති දෝෂය පැහැදිලි කරන්න. නැවත සකස් කරන්න වඩාත් ප්‍රශස්ත කේතයක්.

Задание 2

යම් ක්‍රමලේඛකයෙකුට කර්තව්‍යයක් තිබුණි අංක සංඛ්‍යාව සොයා ගැනීම, සියලු පූර්ණ සංඛ්‍යා 1 සිට 1000000 දක්වා ලිවීමට භාවිතා කළ හැකිය. ඔහු එය පහත පරිදි විසඳුවේය:

php<?php
  echo strlen(implode('', range(1, 1000000)));
?>

මෙම කේතයේ ඇති දෝෂය පැහැදිලි කරන්න. නැවත සකස් කරන්න වඩාත් ප්‍රශස්ත කේතයක්.

Задание 3

යම් ක්‍රමලේඛකයෙකුට කර්තව්‍යයක් තිබුණි ඉතිරියකින් තොරව 7 න් බෙදිය හැකි සංඛ්‍යා ප්‍රමාණය සොයා ගැනීම, දී ඇති පරාසයක පිහිටා ඇත. ඔහු එය පහත පරිදි විසඳුවේය:

php<?php
  $arr = [];
  
  for ($i = 0; $i <= 1000; $i++) {
    if ($i % 7 == 0) {
      $arr[] = $i;
    }
  }
  
  echo count($arr);
?>

මෙම කේතයේ ඇති දෝෂය පැහැදිලි කරන්න. නැවත සකස් කරන්න වඩාත් ප්‍රශස්ත කේතයක්.

Задание 4

යම් ක්‍රමලේඛකයෙකුට කර්තව්‍යයක් තිබුණි සංඛ්‍යාවක බෙදුම්කරුවන්ගේ එකතුව සොයා ගැනීම. ඔහු එය පහත පරිදි විසඳුවේය:

php<?php
  $num = 320;
  $divs = [];
  
  for ($i = 0; $i <= $num; $i++) {
    if ($num % $i == 0) {
      $divs[] = $i;
    }
  }
  
  echo array_sum($divs);
?>

මෙම කේතයේ ඇති දෝෂය පැහැදිලි කරන්න. නැවත සකස් කරන්න වඩාත් ප්‍රශස්ත කේතයක්.