Ottenere un numero di fattori
Domanda
devo ottenere due fattori (x, y) di un dato numero (n) tali che:
- x * y <= n
- x * y dovrebbe essere il più vicino possibile n
- x ed y dovrebbe essere il più vicino possibile tra loro.
Esempi:
- n = 16 => x = 4, y = 4
- n = 17 => x = 4, y = 4
- n = 18 => x = 6, y = 3
- n = 20 => x = 5, y = 4
Ogni lingua farà ma preferibilmente php.
Modifica - PRECISAZIONE
Voglio creare un rettangolo, le unità di larghezza * y unità di altezza tale che la sua area è il più vicino al n possibile x. xey devono essere numeri interi. Se n è un numero primo, allora i fattori di n - 1 sono accettabili
.Soluzione
I tuoi specifiche non erano abbastanza esatto. Lei ha affermato che volevi fattori, ma nel tuo caso prova 4 non un fattore 17
Il seguente pseudo codice funziona dando la priorità che un fattore è esattamente
for i in range(ceiling(sqrt(n)), 1){
if ( n modulo i ) == 0 {
x = i
y = round(n/i)
}
}
Dove come una semplice dichiarazione sqrt lavorerà per assicurare che i numeri sono il più vicino possibile, ma non garantisce che essi sono fattori.
x = y = round( sqrt(n) )
Altri suggerimenti
È necessario decidere quanto siano importanti i vostri tre regole sono.
Possibilità 1: Se x * y essendo più vicino al n possibile è vero allora n = 17 => 1,17 non 4,4. In questo caso si vuole fattorizzazione e ci sono un sacco di modi per farlo, ma il codice come questo è semplice:
for(i = floor(sqrt(n)) .. 1) {
if n % i ==0 {
x = i;
y = n/x;
break;
}
}
Possibilità 2: Se essere vicini l'uno all'altro è più importante che ci si aspetta n = 18 => 4,4 invece di 3,6, e questo codice avrebbe funzionato. Questo però non è fattori.
x=floor(sqrt(n))
y=floor(n/x)
Il problema è irrisolvibile come scritto senza una specificazione più chiara.
Modifica ------------
Ora la spec è stato modificato è ora definito, ma è necessario fare possibilità 1, vedere se il risultato è primo (1 è uno dei valori) e poi, se è ripetere facendo Possibilità 2. Tuttavia, dubito questo è ciò che qualunque insegnante ha scritto questo come compito previsto.
$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
Un'idea da me (più pseudo poi php)
$root = sqrt($inputNumber);
$x = floor($root);
$y = floor($root);
if(($root - $x) > 0.5) $y++;
mi piacerebbe avere tutti i fattori scritti in un array utilizzando il seguente codice.
#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
Poi mi piacerebbe scorrere l'array per verificare quali possono essere effettivamente utilizzati. Per ulteriori informazioni su questo algoritmo, controlla http : //pyfon.blogspot.com.au/2012/09/list-factors-of-number-in-python.html
Ecco una funzione PHP che privilegiano i due 'fattori' essere vicini tra loro su avente fattori precise:
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);
}
Scrivere un programma per trovare il fattore di qualsiasi numero
<?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>