PHP တွင် မလိုအပ်သော array များကို အိုက်တီမိုက်ဆေးရှင်းခြင်း

ဆော့ဝဲရေးသားသူတစ်ဦးသည် 1 မှ 100000000 အထိ ကိန်းပြည့်များ၏ ပေါင်းလဒ်ကို ရှာရန်တာဝန် ရှိတယ်ဆိုပါစို့။

ကျွန်ုပ်တို့၏ ဆော့ဝဲရေးသားသူသည် ဤပြဿနာကို အောက်ပါအတိုင်း ကျွမ်းကျင်စွာ ဖြေရှင်းခဲ့သည်။

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

လှပသောဖြေရှင်းချက် မဟုတ်လား? စာကြောင်းတစ်ကြောင်းတည်းနဲ့ အရာအားလုံးပါဝင်တယ်။ သို့သော် ၎င်းသည် အလုပ်မလုပ်ပါ။ ဤကုဒ်ကို လက်တွေ့အလုပ်လုပ်ကြည့်ပါက မှတ်ဉာဏ်အလွန်အကျွံတောင်းဆိုမှုအတွက် အမှားကို ဖော်ပြလိမ့်မည်။

ဟမ်၊ 100000000 ဆိုတာ အများကြီးမဟုတ်ဘူးလား? သို့မဟုတ် အများကြီးလား? တွက်ကြည့်ရအောင်။ range function သည် 100000000 ကိန်းများပါသော array တစ်ခုကို ဖန်တီးပေးသည်။ PHP သည် ကိန်းတစ်ခုအတွက် 2 ဘိုက်နေရာယူမည်ဟု ဆိုကြပါစို့ - ထို့နောက် ကျွန်ုပ်တို့၏ array ကိုသိမ်းဆည်းရန် 200000000 ဘိုက်၊ ဆိုလိုသည်မှာ RAM မီဂါဘိုက် 200 ခန့် လိုအပ်မည်။

သို့သော် တကယ်တော့ PHP တွင် array သိမ်းဆည်းရာတွင် အလွန်ကြီးမားသော စရိတ်စကများ ရှိနေသောကြောင့် RAM ကို ပိုမိုလိုအပ်မည်ဖြစ်သည်။ ဥပမာအားဖြင့်၊ အမှားစာသားတွင် ကျွန်ုပ်သည် 4294967304 ဘိုက် - ဂီဂါဘိုက် 4 ခန့် ခွဲဝေရန် ကြိုးစားနေကြောင်း ဖော်ပြထားသည်။

ယခု အမှားဖြစ်ရသည့် အကြောင်းရင်းကို နားလည်ပါပြီ - ကျွန်ုပ်တို့သည် ခွင့်ပြုထားသော မှတ်ဉာဏ် ကန့်သတ်ချက်ကို သိသိသာသာ ကျော်လွန်နေသည်။

ကျွန်ုပ်တို့၏ စကရစ်ကို RAM ကို သိပ်မသုံးသော အခြားစနစ်သို့ ပြန်ရေးရန် မခက်ခဲပါ။

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);
?>

ဤကုဒ်တွင် မှားယွင်းနေသည်ကို ရှင်းပြပါ။ ပိုမိုကောင်းမွန်သောကုဒ်သို့ ပြောင်းလဲပါ။