Frage

Ich brauche zwei Faktoren zu bekommen (x, y) eine bestimmte Anzahl (n), so dass:

  • x * y <= n
  • x * y sollte möglichst n so nah
  • x und y sollte sie so nah wie möglich sein.

Beispiele:

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

Jede Sprache wird tun, aber vorzugsweise php.

EDIT - KLARSTELLUNG

Ich mag ein Rechteck erstellen, x Einheiten breit * y Einheiten hoch, so dass seine Fläche zu n so nahe wie möglich ist. x und y müssen ganze Zahlen sein. Wenn n eine Primzahl dann Faktoren von n - 1 sind akzeptabel

.
War es hilfreich?

Lösung

Ihre Angaben waren nicht ganz genau genug. Sie sagten, dass Sie Faktoren, noch im Testfall 4 nicht ein Faktor von 17

gesucht

Der folgende Pseudo-Code funktioniert Priorisierung, dass ein Faktor ist genau

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

Dabei gilt als eine einfache sqrt Erklärung für die Sicherstellung arbeitet, dass die Zahlen sind so nahe beieinander wie möglich, aber nicht garantiert, dass sie Faktoren sind.

x = y = round( sqrt(n) )

Andere Tipps

Sie müssen entscheiden, wie wichtig Ihre drei Regeln sind.

Möglichkeit 1: Wenn x * y wie möglich zu n so nahe wobei gilt dann n = 17 => 1,17 4,4 nicht. In diesem Fall möchten Sie Faktorisierung und es gibt viele Möglichkeiten, es zu tun, aber der Code wie folgt ist einfach:

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

Möglichkeit 2: Wenn sie nahe zu sein ist wichtiger würde man erwarten, n = 18 => 4,4 statt 3,6, und dieser Code funktionieren würde. Dies ist jedoch nicht Faktoren.

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

Das Problem, wie geschrieben ist unlösbares ohne eine klarere Beschreibung.

Bearbeiten ------------

Nun ist die Spezifikation bearbeitet wurde nun definiert ist, aber man muss die Möglichkeit 1, siehe tun, wenn das Ergebnis einer Primzahl ist (1 ist einer der Werte), und dann, wenn es wiederholt Möglichkeit zu tun ist 2. Ich bezweifle jedoch, das ist, was je nachdem, welche Lehrer dies als Hausaufgaben schrieben bestimmt.

$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 

Eine Idee von mir (mehr Pseudo dann php)

$root = sqrt($inputNumber);

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

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

Ich würde alle Faktoren in ein Array geschrieben, um den folgenden Code verwenden.

#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

Dann würde ich Schleife durch das Array zu prüfen, welche davon tatsächlich genutzt werden kann. Weitere Informationen zu diesem Algorithmus Besuche http : //pyfon.blogspot.com.au/2012/09/list-factors-of-number-in-python.html

Hier ist eine PHP-Funktion, die die beiden ‚Faktoren‘ sind nahe beieinander auf, die genauen Faktoren priorisieren:

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

Schreiben Sie ein Programm Faktor einer beliebigen Anzahl finden

<?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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top