Oto zestawienie problemu:Projekt Euler numer 37
Numer 3797 ma interesującą właściwość. Będąc samą siłą podstawową, możliwe jest ciągłe usuwanie cyfr od lewej do prawej i pozostawanie pierwszymi na każdym etapie: 3797, 797, 97 i 7. Podobnie możemy pracować od prawej do lewej: 3797, 379, 37 i 3.
Znajdź sumę tylko jedenastu liczb pierwszych, które są obcinane z lewej do prawej iz prawej do lewej.
UWAGA: 2, 3, 5 i 7 nie są uważane za wstępujące do startu.
Mój kod daje mi częściowe wyjście. Wykonuje się tylko 5 lub 6 z jedenastu wymaganych liczb pierwszych, przy czym 3797 nie jest jednym z nich. Aby znaleźć błąd, ręcznie (na kawałku papieru) uruchomiłem kod dla 3797 i jakoś nie udało mi się znaleźć usterki.
Myślę, że błąd znajduje się w drugiej części, czyli części kodu, która sprawdza, czy liczba jest skracana z lewej strony.
Kod:
#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;
}
}
}
Wystąpił błąd, nie powinien to być x ++, ale x = x * 10. Przepraszam :) –
Zauważ, że zadziała znacznie szybciej, jeśli w 'isprime' bierzesz pod uwagę tylko' i', które spełniają 'i * i <= n'. Ponieważ '2' jest jedyną parzystą liczbą pierwszą, możesz również dodać sprawdzenie dla 2 i zacząć od' 3' w 'for', mając' 2' zamiast '1' jako inkrement. Przypuszczam, że będzie to szybciej niż 100 ms. –