0

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を追加する方法です..

答えは 429 です。

すべての f を追加するにはどうすればよいですか?

4

4 に答える 4

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;
于 2009-02-25T10:32:38.280 に答える
1

これが基本的なプログラミング クラスであり、結果にのみ関心がある場合は、これでそこにたどり着きますが、アルゴリズム クラスの場合は、エラトステネスのふるいを見たいと思うかもしれません。

また、2 桁の数字が別の 2 桁の数字の反転になる理由と、それをどのように表現するかについても考えてみてください。

于 2009-02-25T11:12:19.527 に答える
1

あなたのコードには多くの問題があります。それらのいずれもコンパイルを妨げず、出力の取得に問題を引き起こすこともありません。最初に、目的の結果を得る方法を説明し、次に問題を強調します。

fs を合計するように変更されたコードを次に示します。条件を満たす素数を出力するたびに f を sum に追加するだけです。最後に、すべての 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

10 から 99 までの素数は次のとおりです。
11 11  
13 31  
17 71  
31 13  
37 73  
71 17  
73 37  
79 97  
97 79  

合計:429

...@...デスクトップ:~$

コード内のすべてのコメント (上記) に注意してください。さらに、次のことを検討してください。

  1. 不要なブレースを削除します。
  2. 1 つの変数を 1 つのことに使用する。(f の代わりに x を使用することもできます)。
  3. number や numberOfFactors などのより適切な変数名を使用します。
  4. Mehrdad Afshari が提案したように、コードを関数に分割します。
  5. sqrt(num) (数値の平方根) までテストされる数値 (num) の除数があるかどうかを確認して、素数性をテストすることを検討してください。
  6. このことを考慮:
    • 99までの数字は、反転した数字も2桁の数字です。
    • 数が既に見つかった素数のセットに含まれている場合は、簡単に確認できます。
    • これにより、素数性のチェックの回数が減ります。(高価です)
    • 上記を行うには、識別された素数のリスト (primeList) と反転素数のリスト (revList) を維持します。primeList にもある revList のアイテムはすべて、条件を満たします。その後、必要な合計 (429) を簡単に取得できます。
  7. sweet61の答えを見てください。私の方法でエラトステネスのふるいを使用すると、間違いなくはるかに効率的になります. ふるいの最後で素数を反転し、(最後に) revList に入力できます。

個人レベルでは、最善の解決策を見つけようとしています。あなたも同じことを試みてくれることを願っています。私はすべてをあきらめずにあなたを助けようとしました。

これが役立つことを願っています。


num/2 までの除数をチェックすることを提案したことに注意してください。vartec の提案で sqrt(num) に修正しました。

于 2009-02-25T11:13:03.407 に答える