我需要得到两个因素(x,y)的一定数目(n)这样的:

  • 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是可以接受的。

有帮助吗?

解决方案

你的规格不是相当精确足够的。你说,你想要因素,但在测试的情况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.au/2012/09/list-factors-of-number-in-python.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