5
問題說明如下:歐拉項目號碼:37
數字3797有一個有趣的屬性。作爲素數本身,可以從左到右連續刪除數字,並在每個階段保持素數:3797,797,97和7.同樣,我們可以從右到左工作:3797,379,37和3。
查找從左到右和從右到左都可截斷的只有十一個素數的總和。
注:2,3,5和7不被視爲可截斷的素數。
我的代碼給了我一個部分輸出。輸出11個所需質數中只有5個或6個,其中3797個不是其中之一。所以爲了找到錯誤,我手動(在一張紙上)運行3797的代碼,並以某種方式無法找到毛刺。
我認爲錯誤發生在第二部分,它檢查數字是否從左邊截斷。
代碼:
#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'是唯一的素數,所以你可以在'for'的'3'開始添加一個2的支票,以'2'代替'1'作爲增量。我想它會比100毫秒更快。 –