PHP - 82 ตัวอักษร (บั๊กกี้)
$i=fgets(STDIN);$j=fgets(STDIN);$k=1;while(($a=$j*$k)<$i)$k++;echo($a>$i?--$k:$k);
นี่เป็นวิธีการแก้ปัญหาที่ง่ายมากอย่างไรก็ตามมันไม่ได้จัดการกับเศษส่วนหรืออาการต่าง ๆ ฉันจะไม่ลงรายละเอียดในอันนี้มันค่อนข้างง่าย
อินพุตอยู่ใน stdin คั่นด้วยบรรทัดใหม่
PHP - 141 ตัวอักษร (เต็ม)
$i*=$r=($i=fgets(STDIN))<0?-1:1;$j*=$s=($j=fgets(STDIN))<0?-1:1;$k=0;$l=1;while(($a=$j*$k)!=$i){if($a>$i)$k-=($l>>=2)*2;$k+=$l;}echo$k*$r*$s;
อินพุตและเอาต์พุตเช่นเดียวกับก่อนหน้านี้
ใช่ขนาดนี้เกือบสองเท่าของขนาดก่อนหน้า แต่:
- จัดการเศษส่วนได้อย่างถูกต้อง
- จัดการสัญญาณอย่างถูกต้อง
- จะไม่เข้าสู่วงวนไม่ จำกัด ยกเว้นพารามิเตอร์ที่สองคือ 0 - แต่นั่นคือการหารด้วยศูนย์ - อินพุตที่ไม่ถูกต้อง
จัดรูปแบบและคำอธิบายใหม่:
$i *= $r = ($i = fgets(STDIN)) < 0 ? -1 : 1;
$j *= $s = ($j = fgets(STDIN)) < 0 ? -1 : 1;
// First, in the parentheses, $i is set to
// GET variable i, then $r is set to -1 or
// 1, depending whether $i is negative or
// not - finally, $i multiplied by $r ef-
// fectively resulting in $i being the ab-
// solute value of itself, but keeping the
// sign in $r.
// The same is then done to $j, the sign
// is kept in $s.
$k = 0; // $k will be the result in the end.
$l = 1; // $l is used in the loop - it is added to
// $k as long as $j*$k (the divisor times
// the result so far) is less than $i (the
// divided number).
while(($a = $j * $k) != $i){ // Main loop - it is executed until $j*$k
// equals $i - that is, until a result is
// found. Because a/b=c, c*b=a.
// At the same time, $a is set to $j*$k,
// to conserve space and time.
if($a > $i) // If $a is greater than $i, last step
$k -= ($l >>= 2) * 2; // (add $l) is undone by subtracting $l
// from $k, and then dividing $l by two
// (by a bitwise right shift by 1) for
// handling fractional results.
// It might seem that using ($l>>=2)*2 here
// is unnecessary - but by compressing the
// two commands ($k-=$l and $l>>=2) into 1
// means that curly braces are not needed:
//
// if($a>$i)$k-=($l>>=2)*2;
//
// vs.
//
// if($a>$i){$k-=$l;$l>>=2;}
$k += $l; // Finally, $k is incremented by $l and
// the while loop loops again.
}
echo $k * $r * $s; // To get the correct result, $k has to be
// multiplied by $r and $s, keeping signs
// that were removed in the beginning.
740,2
ยังอนุญาตให้ป้อนข้อมูลหรือไม่ เช่นคั่นด้วยเครื่องหมายจุลภาคหรือไม่