最后一步:添加反向也是素数的所有素数

时间:2009-02-25 10:27:48

标签: c primes

像17一样,是一个素数,当逆转时,71也是素数。

我们设法达到此代码但我们无法完成它。

#include <stdio.h>
main()
{
    int i = 10, j, c, sum, b, x, d, e, z, f, g;

    printf("\nPrime numbers from 10 to 99 are the follwing:\n");

    while (i <= 99)
    {
        c=0;

        for (j = 1; j <= i; j++)
        {
            if (i % j == 0) c++;
        }

        if (c == 2)
        {
            b = i;
            d = b / 10;
            e = b - (10 * d);
            x = (e * 10) + d;

            {
                z = 0;
                f = x;

                for (j = 1; j <= f; j++)
                {
                    if (f % j == 0) z++;
                }

                if (z == 2)
                {
                    printf("%d %d\n", i, f);
                }
            }
        }

        i++;
    }

    getch();
}

我的问题是如何添加所有 f s ..

答案应该是429。

我怎样才能添加所有f?

4 个答案:

答案 0 :(得分:7)

为什么不将代码分解为某些功能:

  • bool isPrime(int number)检查数字是否为素数。
  • int reverse(int number)可以撤消此号码。

然后算法将是:

sum = 0;
for (i = 2; i <= 99; ++i)
   if (isPrime(i) && isPrime(reverse(i)))
      sum += i;

答案 1 :(得分:1)

在开始时初始化sum = 0;。然后,在您的printf旁边计算素数:sum += i;。然后你可以在最后打印出来。

答案 2 :(得分:1)

如果这是一个基本的编程类,你只对结果感兴趣,那么这将使你到那里,但是如果它是算法类,那么你可能想看看Sieve of Eratosthenes

您可能还想考虑是什么使2位数字与另外2位数字相反,以及您将如何表达。

答案 3 :(得分:1)

您的代码中存在许多问题。它们都不会阻止编译,它们都不会导致输出问题。我首先会告诉你如何获得你想要的结果然后突出问题。

这是你的代码,修改为sum fs。每次打印满足条件的素数时,您只需要将f加到总和中。最后,你应该打印所有fs的总和。

#include <stdio.h>

//Use int as the return type explicitly!
int main()
{
         int i=10,j,c,sum,b,x,d,e,z,f,g;
         printf("\nPrime numbers from 10 to 99 are the follwing:\n");
         //Set the sum of all primes whose reverse are also primes to zero
         sum = 0;
         while(i<=99)
         {
            //c is tyhe number of factors.
            c=0;
            for(j=1;j<=i;j++)
            {
                if(i%j==0)
                    c++;
            }
            //If there are only two factors.
            //Two factors (1 and itself) => Prime
            if(c==2) 
            {
                //Reverse i and store it in x
                b=i;
                d=b/10; 
                e=b-(10*d);
                x=(e*10)+d;
                //Curly braces unnecessary
                {
                    //Check if the reverse i.e. x is prime

                    //z is the number of factors
                    z=0;
                    //f is the number being tested for primality.
                    f=x;
                    for(j=1;j<=f;j++)
                    {
                        if(f%j==0)
                            z++;
                    }
                    //If f i.e. x i.e. the reverse has only two factors
                    //Two factors (1 and itself) => Prime
                    if(z==2)
                    {
                        //print the prime number.
                        printf("%d %d  \n",i,f); 
                        //Add f to the sum
                        sum += f;
                    }//if(z==2)                                                         
                }//Unnecessary braces               
            }//if(c==2)
            i++;
        }//end while          

        //print the number of reversed primes!!
        //That is sum of the reversed values of numbers satisfying the 
        //condition!
        printf("\nThe sum is:%d\n", sum); 

        //getch() is non standard and needs conio.h
        //Use getchar() instead.
        //Better solution needed!!
        getchar();

        //Return 0 - Success
        return 0;
} 

输出

...@...-desktop:~$ gcc -o temp temp.c  
...@...-desktop:~$ ./temp

Prime numbers from 10 to 99 are the follwing:
11 11  
13 31  
17 71  
31 13  
37 73  
71 17  
73 37  
79 97  
97 79  

The sum is:429

...@...desktop:~$

请注意代码中的所有注释(上文)。此外,请考虑执行以下操作:

  1. 删除不必要的牙箍。
  2. 将一个变量用于一件事。 (x可以用来代替f)。
  3. 使用更好的变量名称,例如number和numberOfFactors。
  4. 将代码分解为Mehrdad Afshari建议的功能。
  5. 考虑测试素数,检查是否存在被测试的数字(num)的除数,最大为sqrt(num)(数字的平方根)。
  6. 考虑一下:
          
    • 对于最多99的数字,反转的数字也是2位数字。
    •     
    • 如果数字位于已找到的素数集中,您可以轻松验证。
    •     
    • 这将减少检查素数的次数。 (价格昂贵)
    •     
    • 要执行上述操作,请维护已标识的素数列表(primeList)         以及反向素数列表(revList)。 revList中的任何项目也是         在primeList中满足您的条件。然后你可以轻松获得总和(429)         你需要的。
  7. 看看sweet61的答案,使用我的方法使用Eratosthenes筛子肯定会更有效率。您可以在筛子末端反转质数并填充revList(在结尾处)。
  8. 在个人层面上,我试图找到最佳解决方案。我希望你也会尝试这样做。我试图帮助你,而不是全部放弃。

    我希望这会有所帮助。

    注意
    我建议检查最多为num / 2的除数。我根据vartec的建议将其修改为sqrt(num)。