ネタバレ
これはProject Eulerの質問 3 に関するものです。答えが含まれているので、試してみたい場合は先に読まないでください。
したがって、目的は、私が書いたコードがこれを行う数値の最大の素因数を見つけることですが、数値が大きくなると失敗し、理由がわかりません。誰かが私を見てくれるかどうか疑問に思っていました. 私が考えることができる唯一のことは、数がPHPのデータ型のいくつかに対して大きすぎるということですか?
コードを貼り付けます。ローカル テスト環境がない場合は、ここにコードを貼り付けることができます: http://writecodeonline.com/php/
理論 (これを解決するためのより効率的な方法があると確信していますが、私は数学者でも流暢なコーダーでもありません) は、すべての素因数よりも大きくなければならない数から始まるということです。次に、開始番号を別の番号で順次除算しようとしました。結果が整数の場合、整数が得られなくなるまでプロセスを繰り返し実行します (素因数でなければなりません)。次に、最初の数をこの素因数で割って新しい数を取得し、最初の関数にプラグインして新しい素数と別の数を取得します。すべての数が素数になるまでこれを続けます。次に、最大の素数の簡単なチェックがあります。
それは非常に大きな数まで機能します。つまり、最大の素数としてテストする場合、(問題) でテストすると最大の素数として13195
得られますが、これは正しくありません。答えはわかっているので、開始カウンターがそれよりも大きいことを確認しますが、それでも失敗します-理由がわかりません。29
600851475143
6857
お時間をいただきありがとうございます。コードは次のとおりです(より効率的な方法があることはわかっていますが、私の方法が機能しない理由を知りたいです)。
コードは次のとおりです。
$startVal = 13195;
echo "<b>Starting Value</b> = $startVal<br /><br />";
$scriptTime = -microtime(true);
$testVar = 10000;
$primeArray = array();
$processArray = "";
function findPrimes($startStart,$startTest, array & $primeArray, $processArray) {
$test = $startTest;
$start = $startStart;
$holdVal = NULL;
for ($i=$test; $i > 1 ; $i--) {
if(is_int($start/$i) && $start != $i) {
$processArray .= "$start is divisible by $i<br />";
$start = $i;
$i = $test +1;
}
}
$processArray .= "Can't Divide Further<br /><b>Found a Prime : <font color='red'>$start</font></b><br />";
$primeArray[] = $start;
if($start != $startStart) {
$holdVal = $startStart/$start;
}
if(isset($holdVal)) {
findPrimes($holdVal,$startTest,$primeArray,$processArray);
}
return array($primeArray,$processArray);
}
echo "Finding Primes...<br />";
$returnArray = findPrimes($startVal,$testVar,$primeArray,$processArray);
$primeArray = $returnArray[0];
$processArray = $returnArray[1];
echo "Script Found <b>".count($primeArray)."</b> Prime Numbers (";
for ($i=count($primeArray)-1; $i >= 0 ; $i--) {
if(!$i == 0)
echo $primeArray[$i].", ";
else
echo $primeArray[$i].")";
}
echo "<br />The largest Prime Factor of $startVal is <b><font color='red'>".max($primeArray)."</font></b><br />";
$scriptTime = round(($scriptTime += microtime(true))* 1000, 3);
echo "<i>Script took $scriptTime milliseconds<br />";
echo "<br /><br /><b>Process</b><br />";
echo "<pre>";
print_r($processArray);
echo "</pre>";
また、プロセステキストビットを無視します。それを機能させることができません