2つの単純な5桁の数の積である最大の回文数を返し、因子自体を返すプログラムを作成しようとしていました。
素数は、1とそれ自体でのみ除算される自然数です(2、3、5、7、11、...)
回文数は、両方の方法で同じように読み取られます(たとえば、ABBA)。
if(isPalin(mul) && isPrime(i) && isPrime(j))
function isPrime(i){
for (var k = 2; k <= i; k++) {
if (i%k===0 && i!==k) {
return false;
}
}
return true;
}
<!--code-->
<script>
function largestPalindrome(){
for(var i = 99999; i>10000; i--){
for(var j = 99999; j>10000; j--){
var mul = j*i;
if(isPalin(mul) && isPrime(i) && isPrime(j)){
return i * j;
}
}
}
}
function isPalin(i){
return i.toString() == i.toString().split("").reverse().join("");
}
function isPrime(i){
for (var k = 2; k <= i; k++) {
if (i%k===0 && i!==k) {
return false;
}
}
return true;
}
console.log(largestPalindrome());
</script>
このプログラムを実行すると、コンソールに何も表示されず、理由がわかりません。
問題::時間計算量
isPrime()
function isPrime(n)
{
// Corner cases
if (n <= 1) return false;
if (n <= 3) return true;
// This is checked so that we can skip
// middle five numbers in below loop
if (n%2 == 0 || n%3 == 0) return false;
for (var i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false;
return true;
}
あなたのisprime
機能は最適化されていません。これを使用する必要があります。
すべての素数を2回見つけないでください。すべての素数を一度見つけてリストに保存し、素数リストからすべての素数を選んで、それが回文であるかどうかを確認するだけです。
var primelist = [];
for(var i = 99999; i > 10000; i++)
{
if(isprime(i))
{
primelist.push(i);
}
}
for (var i = 0; i < primelist.length; i++) {
for (var j = 0; j < primelist.length; j++)
{
if(isPalindrome(i*j))
{
// Number you want.
return (i*j);
}
}
}
確認するには、最大の素数から始めます。
5桁の数字は、11111から99999ではなく10000から99999で始まります。ただし、関数の出力は変更されません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加