获取数字因子

时间:2009-12-07 14:34:30

标签: php numbers factors

我需要得到给定数字(n)的两个因子(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
  • n = 20 => x = 5,y = 4

任何语言都可以,但最好是php。

编辑 - 澄清

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

7 个答案:

答案 0 :(得分:4)

您的规格不够准确。你表示你想要因素,但在你的测试案例中,4 不是因子为17

以下伪代码优先处理一个因素是 exact

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 :(得分:4)

您需要决定三条规则的重要性。

可能性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.但是,我怀疑这就是老师把这个写成家庭作业的目的。

答案 2 :(得分:1)

我的想法(更伪,然后是php)

$root = sqrt($inputNumber);

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

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

答案 3 :(得分:1)

$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 

答案 4 :(得分:1)

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

#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.au/2012/09/list-factors-of-number-in-python.html

答案 5 :(得分:0)

这是一个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);
}

答案 6 :(得分:0)

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

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