Php 求一个数的因子

Php 求一个数的因子,php,numbers,factors,Php,Numbers,Factors,我需要得到给定数字n的两个因子x,y,这样: x*y x=4,y=4 n=17=>x=4,y=4 n=18=>x=6,y=3 n=20=>x=5,y=4 任何语言都可以,但最好是php 编辑-澄清 我想创建一个矩形,x单位宽*y单位高,使其面积尽可能接近n。x和y必须是整数。如果n是一个素数,那么n-1的因子是可以接受的。您的规范不够精确。您声明需要因子,但在您的测试用例中,4不是17的因子 下面的伪代码优先考虑一个因素是精确的 其中,作为一个简单的sqrt语句,可以确保数字尽可能接近,但不能保

我需要得到给定数字n的两个因子x,y,这样:

x*y x=4,y=4 n=17=>x=4,y=4 n=18=>x=6,y=3 n=20=>x=5,y=4 任何语言都可以,但最好是php

编辑-澄清


我想创建一个矩形,x单位宽*y单位高,使其面积尽可能接近n。x和y必须是整数。如果n是一个素数,那么n-1的因子是可以接受的。

您的规范不够精确。您声明需要因子,但在您的测试用例中,4不是17的因子

下面的伪代码优先考虑一个因素是精确的

其中,作为一个简单的sqrt语句,可以确保数字尽可能接近,但不能保证它们是因子

x = y = round( sqrt(n) )

你的规格不够精确。您声明需要因子,但在您的测试用例中,4不是17的因子

下面的伪代码优先考虑一个因素是精确的

其中,作为一个简单的sqrt语句,可以确保数字尽可能接近,但不能保证它们是因子

x = y = round( sqrt(n) )

我的想法比php更伪

$root = sqrt($inputNumber);

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

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

我的想法比php更伪

$root = sqrt($inputNumber);

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

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

你需要决定你的三条规则有多重要

可能性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 
可能性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。然而,我怀疑这是哪个老师写这篇作业的初衷。

这里有一个PHP函数,它将两个相互接近的“因素”优先于具有确切的因素:

$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 
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函数,它将两个相互接近的“因素”优先于具有确切的因素:

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

我将使用以下代码将所有因子写入数组

#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

然后我将循环遍历数组,检查哪些数组可以实际使用。有关此算法的更多信息,请查看我将使用以下代码将所有因子写入数组

#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

然后我将循环遍历数组,检查哪些数组可以实际使用。有关此算法的更多信息,请查看

编写程序以查找任意数字的因子

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

编写一个程序来求任意数的因子

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

我想您需要PHP中的floor函数。与其称之为RountToZero,不如称之为floor:这是一个具有所述功能的常见函数,因此更容易识别。谢谢,我知道它有自己的名称:我想您需要PHP中的floor函数。与其称之为RountToZero,不如称之为floor:这是一个具有所述功能的常见函数,因此更容易识别。谢谢,我知道它有自己的名称:这个问题有点误导人。4不是17的因子。他不是在寻求一种将数字分解的方法。@badp:我知道,这就是为什么我说使用因子这个词是误导性的。问题的标题是获取一个数字的因子,它从我需要获取给定数字的两个因子开始。但他并不是真的想要因子。对于57,你会选择7*8还是3*19?3,19,因为这些因子可以完美地相乘。对于18,我们有3,6和2,9-3,6更接近,所以选择了。这个问题有点误导。4不是17的因子。他不是在寻求一种将数字分解的方法。@badp:我知道,这就是为什么我说使用因子这个词是误导性的。问题的标题是获取一个数字的因子,它从我需要获取给定数字的两个因子开始。但他并不是真的想要因子。对于57,你会选择7*8还是3*19?3,19,因为这些因子可以完美地相乘。对于18,我们有3,6和2,9-3,6更接近,因此被选中
是因为n=17的测试用例与其他测试用例不一致。所有其他测试用例都有x和y作为因子,其中as 17由于未指明的原因没有。这和沿着这些线的所有答案都是可以的,除了Dor提到的素数被视为特例。这是因为n=17的测试用例与其他测试用例不一致。所有其他测试用例都有x和y作为因子,其中as 17没有,原因不明。这和所有沿着这些线的答案都是可以的,除了素数被视为Dor提到的特殊情况。谢谢,素数情况正是我需要的。谢谢,素数情况正是我需要的。