-4

Alex Alllain 著の「Jumping into C++」という本を使用して C++ の学習を開始しましたが、1 つの演習で問題が発生しました。演習のテキストは次のとおりです。

1 から 1000 までのすべての数のうち、それらの素因数を足し合わせると素数になる (たとえば、12 には 2、2、3 の素因数があり、これらの合計が素数である 7) を見つけるプログラムを設計してください。 . そのアルゴリズムのコードを実装します。

良いと思ったコードを書きましたが、うまくいきません。

ただし、コードは次のとおりです。

#include <iostream>

using namespace std;


int main()
{
    for (int number = 2 ; number < 1000 ; number++)
    {
            int sum = 0;
            int something = number;
            if (primeNumber(number) == true)
        {
            sum = number;
        }
        else
        {
            while (something != 1)
            {
                for (int factor = 2 ; factor <= number; factor++)
                {
                    if (primeNumber(factor) == true)
                    {
                        while(something % factor == 0)
                        {
                            something /= factor;
                            sum += factor;
                        }
                    }
                }
            }
        }
        if (primeNumber(sum)== true)
        {
            cout << number << endl;
        }
    }
}
int primeNumber(int x)

{
    for (int i = 2 ; i < x; i++)
    {
        if (x % i == 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}
4

1 に答える 1

0

primeNumber() 関数に問題があります。for ループでは、「else」ステートメントを含めないでください。たとえば、x=9 とします。次に、i が 2 で始まると、(x%i==0) が false になります。したがって、コードによれば、9 が合成数であっても、関数はすぐに「true」を返します。正しいコードは次のとおりです。

for (int i=2;i<x;i++)
if(x%i==0) return false;
return true;

このようにして、コードは x の可能な因数をすべて調べ、x が 2、3 の整数倍、または x-1 でない場合にのみ、関数は「true」を返します。

お役に立てれば:)

于 2013-07-28T14:36:47.233 に答える