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

.
È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top