Получить факторы ряда - PullRequest
       9

Получить факторы ряда

1 голос
/ 07 декабря 2009

Мне нужно получить два множителя (x, y) данного числа (n), таких что:

  • x * y <= n </li>
  • x * y должно быть как можно ближе к n
  • x и y должны быть как можно ближе друг к другу.

Примеры:

  • n = 16 => 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. х и у должны быть целыми числами. Если n - простое число, то факторы n - 1 являются приемлемыми.

Ответы [ 7 ]

4 голосов
/ 07 декабря 2009

Вы должны решить, насколько важны ваши три правила.

Возможность 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. Однако я сомневаюсь это то, что учитель написал это как домашнее задание.

4 голосов
/ 07 декабря 2009

Ваши спецификации не были достаточно точными. Вы заявили, что вам нужны факторы, но в вашем тестовом примере 4 не равно с коэффициентом 17

Следующий псевдокод работает с приоритетом того, что один фактор равен точный

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

Где простая инструкция sqrt будет работать для обеспечения того, чтобы числа были как можно ближе друг к другу, но не гарантирует, что они являются факторами.

x = y = round( sqrt(n) )
1 голос
/ 18 сентября 2012

Я бы записал все факторы в массив, используя следующий код.

#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

Тогда я бы перебрал массив, чтобы проверить, какие из них действительно могут быть использованы. Чтобы узнать больше об этом алгоритме, проверьте http://pyfon.blogspot.com.au/2012/09/list-factors-of-number-in-python.html

1 голос
/ 07 декабря 2009
$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 голос
/ 07 декабря 2009

Идея от меня (больше псевдо, чем PHP)

$root = sqrt($inputNumber);

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

if(($root - $x) > 0.5) $y++;
0 голосов
/ 20 июля 2017

Напишите программу для поиска коэффициента любого числа

<?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>
0 голосов
/ 07 декабря 2009

Вот функция 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...