Php 求一个数的因子
我需要得到给定数字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 编辑-澄清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语句,可以确保数字尽可能接近,但不能保
我想创建一个矩形,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提到的特殊情况。谢谢,素数情况正是我需要的。谢谢,素数情况正是我需要的。