سؤال

دعنا نقول أن لديّ متغير يحتوي على عدد صحيح أو تعويم (لأن الأعداد الصحيحة قد تفيض في تعويم في PHP).

أرغب في تشغيل بعض العمليات للحصول على أقصى اليسار وبقية الأرقام المتبقية.

لشرح أفضل:

<?php

$x   = NULL;  //this will hold first digit
$num = 12345; //int

/// run operation


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

?>

الآن ، أعلم أن هناك العديد من الطرق للقيام بذلك إذا كنت تمثل الرقم كسلسلة ، لكنني أحاول تجنب الكتابة في سلسلة.

ربما أبحث عن حل يتضمن عمليات bitwise ، لكنني ضعيف جدًا في هذا الموضوع ، لذلك آمل أن يكون الشخص الذي يعمل عادة على مستوى منخفض قادرًا على الإجابة على هذا!

اشكرك كثيرا.

هل كانت مفيدة؟

المحلول

يتجنب استخدام أي معالجة سلسلة ، ولكن لا توجد ضمانات للعائمة أو حتى القيم السلبية

$x   = NULL;  //this will hold first digit
$num = 12345; //int

$m = 1;
while(true) {
    $m *= 10;
    if ($m > $num)
        break;
}

$m /= 10;

$x = (int) floor($num / $m);
$num = $num % $m;


//outputs
//$x   = 1;
//$num = 2345;
var_dump($x, $num);

نصائح أخرى

أنا متأكد من أن هناك طريقة للقيام بذلك دون إلقاءه على سلسلة ، ولكن لماذا؟ ال string الالتفاف سهل للغاية:

$x = (int)substr($num, 0, 1); 

سوف يعطيك عدد صحيح لطيف ومناسبة.

من الواضح أن هذا لا يوجد فحص موسع للمدخلات الخاطئة ، ويتطلب $num ليكون رقمًا صالحًا.

طريقة الرياضيات فقط:

function leftMost($num) {  
    return floor($num/pow(10,(floor((log10($num))))));
}

أوضحت أعتقد ...

1+ log10 من NUM يحسب عدد الأرقام هو الرقم ، ونحن نضعه في إزالة أي قيم عشرية ، وضعه كأسعار لذلك لرقم 1 رقم نحصل على 10^0 = 1 ، أو رقم 8 أرقام نحصل عليه 10 ^8. نحن بعد ذلك نقوم فقط بتفريغ 12345678/10000000 = 1.2345678 ، والذي يحصل على الأرض وهو واحد فقط.

ملاحظة: يعمل هذا للأرقام بين الصفر والآخر أيضًا ، حيث ستعود 2 في 0.02 ، وسوف يفشل تحويل السلسلة.

إذا كنت ترغب في العمل مع الأرقام السلبية ، اجعل $ num = abs ($ num) أولاً.

للحصول على بقية الأرقام

$ المتبقي = (int) substr ((سلسلة) $ num ، 1 ، strlen ($ num)) ؛

إذا قمت بتكوين القيمة إلى سلسلة ، فيمكنك استخدام محدد نوع الصفيف.

فمثلا:

$n = (string)12345676543.876543;
echo (int)$n[0];

قدمت Mark Baker أفضل حل ، على الرغم من أنه يجب عليك القيام به abs(floor($num)) قبل تطبيق الخوارزمية.

أعلم أنك ذكرت أنك تريد تجنب الإلقاء على سلسلة ، ولكن إذا كنت ترغب في حلقة الأرقام في PHP ، فستكون هذه هي أسرع طريقة:

$len = strlen($n);
for ($i = 0; $i < $len; ++$i)
  $d = $n[$i];

في معيار سريع ودني ، كان حوالي 50 ٪ أسرع من المجموعة المكافئة من التعبيرات الرياضية ، حتى عند تقليل المكالمات إلى أدنى حد log و exp.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top