0

重複の可能性:
素数2、3、および5のみを使用してシーケンスを生成し、n番目の項を表示する(C ++)

私はこれについてずっとブレインストーミングをしてきましたが、これを理解することはできません。次の問題を解決する必要があります。

次のシーケンスを生成し、シーケンスのn番目の項を表示します

2,3,4,5,6,8,9,10,12,15など....シーケンスには素数2、3、5のみがあります

while、for、ifなどの基本的なC++を使用する必要があります。特別なことは何もありません。配列についてよく知らないという理由だけで配列を使用することはできません。また、ソリューションのコードを理解したいと思います。

私は完全な解決策を求めているのではありませんが、これを乗り越えるためのガイダンスを求めています...お願いします。

私の問題は、シーケンス内の数が2、3、および5以外の他の素数で割り切れるかどうかを確認する方法がわからないことです。

また、次のように番号を確認しているとしましょう。

for(int i=2; i<n; i++){
    if(i%2==0){
        cout<<i<<", ";
    }else if(i%3==0){
        cout<<i<<", ";
    }else if(i%5==0){
        cout<<i<<", ";
    }

素数7で割ることができる14などの数を生成するという事実だけでは機能しません。したがって、そのシーケンスが2、3、およびで割り切れるだけであることを確認する方法を理解する必要があります。 5 .....私は問題の解決策を含む多くの資料をオンラインで見つけましたが、それらの解決策はあまりにも進んでおり、私はそれらを使用できません(それらのほとんどは他の言語で書かれています... C ++)。もっと簡単な方法があると思います。

4

3 に答える 3

1

次の i の値を一時変数に格納し、できる限り 2 で割ります (例: i%2 == 0 である限り)。次に、できる限り 3 で割ります。それから 5 です。

于 2013-01-24T06:10:42.740 に答える
1

コードの問題は、素因数のすべてではなく、1 つだけをチェックすることです。

14 の例を考えてみましょう。コードは、2、3、または 5 が 14 の因数であるかどうかのみをチェックしますが、これはまさに必要なものではありません。確かに、2 は 14 の因数であることがわかりますが、もう 1 つの因数は、あなたが言ったように 7 です。あなたが見逃しているのは、7が因数2、3、および5のみであるかどうかをさらに確認することです(そうではありません)。あなたがする必要があるのは、すべての要因 2、3、および 5 を排除し、何が残っているかを確認することです。

2 つの例を見てみましょう: 60 と 42

60用

因子 2 から始める

  • 60 % 2 = 0 なので、60 / 2 = 30 をチェックします。
  • 30 % 2 = 0 なので、30 / 2 = 15 をチェックします。
  • 15 % 2 = 1 なので、2 の因数はもうありません。

要因 3 を続ける

  • 15 % 3 = 0 なので、15 / 3 = 5 をチェックします。
  • 5 % 3 = 2 なので、3 の因数はもうありません。

係数 5 で終了

  • 5 % 5 = 0 なので、5 / 5 = 1 をチェックします
  • 1 % 5 = 1 なので、これ以上 5 の因数はありません。

最終的に 1 になるので、この数は数列の一部です。

42用

繰り返しますが、係数 2 から始めます

  • 42 % 2 = 0 なので、42 / 2 = 21 をチェックします。
  • 21 % 2 = 1 なので、2 の因数はもうありません。

要因 3 を続ける

  • 21 % 3 = 0 なので、21 / 3 = 7 をチェックします。
  • 7 % 3 = 1 なので、3 の因数はもうありません。

係数 5 で終了

  • 7 % 5 = 2 なので、5 の因数はもうありません。

最終的に 7 (1 とは異なるもの) になるため、この数は数列の一部ではありません。

したがって、実装では、この理由を反映するために、for ループに 3 つの while ループをネストする必要があります。

于 2013-01-24T08:22:12.940 に答える
0

これはどうですか?

bool try_hamming(int n)
{
    while(n%2 == 0)
    {
        n = n/2;
    }
    while(n%3 == 0)
    {
        n = n/3;
    }
    while(n%5 == 0)
    {
        n = n/5;
    }
    return n==1;
}

n がハミング数の場合は true を返し、それ以外の場合は false を返します。したがって、メイン関数は次のようになります

 #include<iostream>
 using namespace std;
 main()
 {
      for(int i=2;i<100;++i)
      {
          if(try_hamming(i) )
          cout<< i <<",";
       }
      cout<<end;
  }

これにより、100 未満のすべてのハミング数が出力されます。

于 2013-01-24T09:24:18.053 に答える