Question

Je dois obtenir deux facteurs (x, y) d'un nombre donné (n) tel que:

  • x * y <= n
  • x * y devrait être aussi proche que possible n
  • x et y doit être aussi proches les uns des autres que possible.

Exemples:

  • n = 16 => x = 4, y = 4
  • n = 17 => x = 4, y = 4
  • n = 18 => x = 6, y = 3
  • n = 20 => x = 5, y = 4

Toute langue fera, mais de préférence php.

EDIT - CLARIFICATION

Je veux créer un rectangle, x unités de largeur * unités y hauteur telle que sa région est aussi proche que possible n. x et y doivent être des nombres entiers. Si n est un nombre premier, alors les facteurs de n - 1 sont acceptables

.
Était-ce utile?

La solution

Vos spécifications ne sont pas assez précis. Vous avez dit que vous vouliez facteurs, mais dans votre cas de test 4 est pas un facteur de 17

Le pseudo-code suivant fonctionne priorise que l'un des facteurs est exact

for i in range(ceiling(sqrt(n)), 1){
    if ( n modulo i ) == 0 {
          x = i
          y = round(n/i)
    }
}

Où comme une simple déclaration sqrt travaillera pour veiller à ce que les chiffres sont aussi proches que possible, mais ne garantit pas que ce sont des facteurs.

x = y = round( sqrt(n) )

Autres conseils

Vous devez décider à quel point vos trois règles.

Possibilité 1: Si x * y être aussi proche que possible n est vrai, alors n = 17 => 1,17 pas 4,4. Dans ce cas, vous voulez factorisation et il y a beaucoup de façons de le faire, mais le code comme ceci est simple:

for(i = floor(sqrt(n)) .. 1) {
  if n % i ==0 {
     x = i;
     y = n/x;
     break;
  }
}

Possibilité 2: Si la proximité de l'autre est plus important que vous attendez n = 18 => 4,4 au lieu de 3,6, et ce code fonctionnerait. Ceci est toutefois pas des facteurs.

x=floor(sqrt(n))
y=floor(n/x)

Le problème est écrit sans une spécification sans solution claire.

EDIT ------------

Maintenant, la spécification a été modifié, il est maintenant défini, mais vous devez faire Possibilité 1, voir si le résultat est premier (1 est l'une des valeurs) et si elle est en train de faire la répétition Possibilité 2. Cependant, je doute c'est ce que l'enseignant a écrit selon ce que les devoirs prévu.

$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 

Une idée de moi (plus pseudo puis php)

$root = sqrt($inputNumber);

$x = floor($root);
$y = floor($root);

if(($root - $x) > 0.5) $y++;

J'ai tous les facteurs écrits à un tableau en utilisant le code suivant.

#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

Ensuite, je boucle à travers le réseau pour vérifier ceux qui peuvent effectivement être utilisés. Pour en savoir plus sur cet algorithme, consultez : //pyfon.blogspot.com.au/2012/09/list-factors-of-number-in-python.html

Voici une fonction PHP qui accordent la priorité aux deux « facteurs » étant proches les uns des autres sur les facteurs ayant exactement:

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);
}

Ecrire un programme pour trouver le facteur d'un nombre

<?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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top