项目欧拉编号37

时间:2011-12-07 11:34:38

标签: c

以下是问题陈述:

3797号有一个有趣的属性。作为素数本身,可以从左到右连续删除数字,并在每个阶段保持素数:3797,797,97和7.同样,我们可以从右到左工作:3797,379,37和3。

找到从左到右和从右到左都可截断的仅有11个素数之和。

注意: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;
            }                                                                                                                                                                                       
        }   

      }

1 个答案:

答案 0 :(得分:3)

你的左截断检查是错误的。我做得与众不同,更简单。

#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 power(int a, int b){
    int r = 1;
    int i=0;
    for (i=0;i<b;i++){
        r = r * a;
    }
    return r;
}

int main(void)
{
    int count=0,z=0;
    int i;
    int n;
    int z1=0;
    int p;
    int count1=0;
    int digits;
    int k=1000000;
    for(i=2;i<k;i++)
    {
        if(isprime(i)==1)
        {
            z = 0;
            count = 0;
            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++;
                }else{
                    count = -1;
                    break;
                }   
                z++;
            }

            if(z==count) 
            {   
                z1= 0;
                count1=0;
                n = i;
                p= i;
                while(p>0) //Checks whether number is left truncatable 
                {   
                    digits=n%power(10,z1+1);
                    p = p /10;
                    if (isprime(digits)==1)
                    {
                        count1++; 
                    }else{
                        count1 =-1;
                        break;
                    }
                    z1++;
                }

                if(z1==count1)
                    printf("%d\n ",i);

            }
        }                                                                                                                                                                                       
    }   

}