سؤال

أحتاج إلى الحصول على عاملين (X، Y) رقم معين (ن) بحيث:

  • x * y <= n
  • x * y يجب أن تكون قريبة من n قدر الإمكان
  • يجب أن تكون x و y بالقرب من بعضها البعض قدر الإمكان.

أمثلة:

  • n = 16 => x = 4، y = 4
  • n = 17 => x = 4، y = 4
  • n = 18 => x = 6، y = 3
  • ن = 20 => x = 5، y = 4

أي لغة سوف تفعل ولكن يفضل أن يكون php.

تحرير - توضيح

أرغب في إنشاء مستطيل، ووحدات X Wide * YOULT YOURS TALL بحيث تكون منطقتها بالقرب من N قدر الإمكان. يجب أن تكون x و y أعداد صحيحة. إذا كان N رقم رئيسي ثم عوامل N - 1 مقبولة.

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

المحلول

مواصفاتك لم تكن بالضبط تماما بما فيه الكفاية. ذكرت أنك تريد العوامل، ولكن في حالة الاختبار 4 ليس عامل 17

يعمل الرمز الزائدي التالي الأولوية لتحديد أولويات ذلك عامل واحد بالضبط

for i in range(ceiling(sqrt(n)), 1){
    if ( n modulo i ) == 0 {
          x = i
          y = round(n/i)
    }
}

حيث سيظهر بيان SQRT بسيط لضمان أن الأرقام قريبة من بعضها البعض، ولكن لا تضمن أنها عوامل.

x = y = round( sqrt(n) )

نصائح أخرى

تحتاج إلى أن تقرر مدى أهمية قواعدك الثلاث.

الاحتمال 1: إذا كانت x * y أقرب وقت ممكن من n، فمن الصحيح، ثم n = 17 => 1،17 وليس 4،4. في هذه الحالة، تريد العظام وهناك الكثير من الطرق للقيام بذلك، ولكن الكود مثل هذا بسيط:

for(i = floor(sqrt(n)) .. 1) {
  if n % i ==0 {
     x = i;
     y = n/x;
     break;
  }
}

الاحتمال 2: إذا كان هناك قريب من بعضها البعض هو أكثر أهمية كنت تتوقع n = 18 => 4،4 بدلا من 3،6، وسيعمل هذا الرمز. ولكن هذا ليس عوامل.

x=floor(sqrt(n))
y=floor(n/x)

المشكلة كما هو مكتوب غير قابل للحل دون مواصفات أوضح.

تعديل ------------

الآن تم تحرير المواصفات الآن محددة الآن، ولكن عليك القيام بالإمكانية 1، معرفة ما إذا كانت النتيجة هي الوزراء (1 هي واحدة من القيم) ثم إذا كانت تكرار القيام بالإمكانية 2. ومع ذلك، أشك في أن هذا هو ما هو عليه أيهما كتب هذا المعلم هذا كواجبات منزليه.

$num = ...; // some number

if (is_prime($num)) // implement the is_prime() function yourself
    --$num; // Subtract to get an even number, which is not a prime

$candidates = array();  // Numbers that may fit.

$top_search = $num / 2; // Limits the useless search for candidates

for($i=1; $i < $top_search; ++$i)
{
    if ($num % $i == 0)
        $candidates[$i] = $num / $i;
}

// Now, check the array in the middle 

فكرة مني (مزيد من الزائفة ثم PHP)

$root = sqrt($inputNumber);

$x = floor($root);
$y = floor($root);

if(($root - $x) > 0.5) $y++;

لدي كل العوامل المكتوبة إلى صفيف باستخدام التعليمات البرمجية التالية.

#Application lists all factors/divisors for a number.
targetNumber=input('What number do you want the factors for?\n> ')
factors=[]
for i in range(1,targetNumber):
    if targetNumber%i==0:
        factors.append(i)
    elif targetNumber/i==1:
        factors.append(targetNumber)
        break
print factors

ثم أنا حلقة من خلال الصفيف للتحقق من تلك التي يمكن استخدامها بالفعل. لأكثر من هذه الخوارزمية، تحقق من http://pyfon.blogspot.com.auouse2/09/list-factors-of-number-in-phonethon.html.

فيما يلي وظيفة PHP التي تعطي الأولوية لكونها "العوامل" القريبة من بعضها البعض بسبب وجود عوامل دقيقة:

function weird_factors($ori) {
    $sq = intval(sqrt($ori));
    $start = $sq - 10;
    $end = $sq + 10;
    $n = 0;
    for ($s = $start; $s <= $end; $s++) {
        for ($t = $start; $t <= $end; $t++) {
            $st = $s * $t;
            if ($st <= $ori and $st > $n) {
                $n = $st;
                $ns = $s;
                $nt = $t;
            }
        }
    }
    return array($ns, $nt);
}

اكتب برنامجا للعثور على عامل أي رقم

<?php
if(isset($_POST['sub']))
 {     $j=0;
   $factor=array(); 
   $num=$_POST['nm1'];
   for($i=1;$i<=$num;$i++)  
       {
          if($num%$i==0)
            { 
             $j++;
             $factor[$j]=$i;
            }
       }
}
 ?>

 <table>
 <form name="frm" method="post" action="">
 <tr> <td>Number:</td> <td><input type="text" name="nm1" /></td> </tr>
 <tr><td></td><td><input type="submit" name="sub" /></td>
 <td><center><span>  
  <?php   
    if(isset($_POST['sub']))  
    { 
       echo "Factors are :";for($i=1;$i<=count($factor);$i++) 
       {          echo $factor[$i].",";

        }
     }       
  ?>   
   </span></center></td></tr>
 </form>
 </table>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top