ここに問題文があります:プロジェクトオイラーの数37
3797という数字は興味深い性質があります。プライムそれ自体では、左から右に連続して数字を削除し、各段階でプライムを維持することができます:3797,779,97、および7同様に、右から左:3797,379,37および3で作業できます。
左から右に、右から左に切り捨てられる11個の素数の合計を求めます。
注:2,3,5、および7は切り捨て可能な素数ではないとみなされます。
私のコードは、私に部分的な出力を与えます。必要な11個の素数のうち5個または6個だけが出力され、3797個はそれらの1個ではない。だから、エラーを見つけるために、私は手作業で(紙面に)3797のコードを実行し、何とかしてグリッチを見つけることができませんでした。
エラーは2番目の部分にあります。数字が左側から切り捨てられるかどうかを確認するコードの部分です。
コード:
#include<stdio.h>
int isprime(int n) //Checks whether the number is prime or not
{
int i;
if(n==1)
return(0);
for(i=2;i<n/2+1;i++)
{
if(n%i==0)
{
return(0);
break;
}
}
return(1);
}
int main(void)
{
int count=0,z=0;
int i;
int n;
int x=1;
int reverse2=0;
int z1=0;
int p;
int count1=0;
int digit;
int k=1000000;
int reverse=0;
for(i=2;i<k;i++)
{
if(isprime(i)==1)
{
n=i;
p=i;
while(n>0) // This function removes the digits of the prime number from the right
{
n=n/10;
if(isprime(n)==1)
{
count++;
}
z++;
}
if(z==count)
{
while(p>0) //Checks whether number is left truncatable
{
digit=p%10;
p=p/10;
if(z1==0)
{
reverse=digit;//here reverse doesn't refer to reversing the number. It builds the number one digit at a time from right to left.
}
else
{
reverse=digit*x*10+reverse;
x++;
}
if(isprime(reverse)==1)
{
count1++;
}
z1++;
}
if(z1==count1)
printf("%d ",i);
}
z=0;
z1=0;
count1=0;
count=0;
reverse=0;
reverse2=0;
x=1;
}
}
}
エラーが発生しました。これはx ++ではなくx = x * 10です。申し訳ありません:) –
isprimeで 'i * i <= n'を満たす' i'だけを考えればもっと速く動作することに注意してください。 '2'が唯一の素数であるので、2のチェックを追加し、' for'の '3'から始まり、' 1'の代わりに '2'をインクリメントとして使用することもできます。私はそれが100ミリ秒より速くなると思います。 –