1

次のように、特定の数値 ( n ) の 2 つの要素 ( x, y ) を取得する必要があります。

  • x * y <= n
  • 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 単位 x 高さ y 単位の長方形を作成して、その面積ができるだけ n に近くなるようにします。x と y は整数でなければなりません。n が素数の場合、n - 1 の因数が許容されます。

4

7 に答える 7

5

あなたの仕様は十分に正確ではありませんでした。ファクターが必要だとおっしゃいましたが、テストケースでは4は17のファクターではありません

次の擬似コードは、1つの要素が正確であることを優先して機能します

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) )
于 2009-12-07T14:39:41.457 に答える
4

3 つのルールがどれほど重要かを判断する必要があります。

可能性 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:互いに近いことがより重要である場合は、3,6 ではなく n=18=>4,4 を期待し、このコードは機能します。ただし、これは要因ではありません。

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

書かれている問題は、より明確な仕様がなければ解決できません。

編集------------

これで仕様が編集され、定義されましたが、可能性 1 を実行する必要があります。結果が素数 (1 は値の 1 つ) であるかどうかを確認し、可能性 2 を繰り返している場合は、可能性 2 を実行する必要があります。宿題が意図したようにこれを書いた教師は誰でも。

于 2009-12-07T14:52:04.210 に答える
1
$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 
于 2009-12-07T14:57:27.967 に答える
1

次のコードを使用して、すべての要素を配列に書き込みます。

#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をご覧ください。

于 2012-09-18T10:07:20.240 に答える
1

私からのアイデア(phpより疑似)

$root = sqrt($inputNumber);

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

if(($root - $x) > 0.5) $y++;
于 2009-12-07T14:51:09.927 に答える
0

これは、正確な要素を持つよりも、互いに近い2つの「要素」を優先する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);
}
于 2009-12-07T14:59:22.860 に答える