代码之家  ›  专栏  ›  技术社区  ›  Salman Arshad

求一个数的因子

  •  1
  • Salman Arshad  · 技术社区  · 16 年前

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

    • x*y& lt;= 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 回复  |  直到 8 年前
        1
  •  4
  •   Yacoby    16 年前

    你的规格不够精确。你说你想要因子,但是在你的测试用例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) )
    
        2
  •  4
  •   Nick Fortescue    16 年前

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

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

        3
  •  1
  •   Dor    16 年前
    $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
  •   Bobby    16 年前

    我的一个想法(比PHP更假)

    $root = sqrt($inputNumber);
    
    $x = floor($root);
    $y = floor($root);
    
    if(($root - $x) > 0.5) $y++;
    
        5
  •  1
  •   Salman Arshad    13 年前

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

    #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

        6
  •  0
  •   Lukman    16 年前

    下面是一个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);
    }
    
        7
  •  0
  •   pradip kor    8 年前

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

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