0

私はまだプログラミングが得意ではなく、私がやりたいことを行うためのより良い方法があると言って始めたいと思います. 露骨に悪いものを見るのが面倒なら、先に進んでください。

Project Euler の 3 番目の質問である「600851475143 の最大の素因数を見つけてください」に挑戦しています。まず、数の因数を計算するものを作りました。(名前はすみません、何も思いつきませんでした。)

#include <iostream>

using namespace std;

void Factor (double dFactorer)
{
    long dUpperlimit;
    dUpperlimit = (int)dFactorer/2;
    float fnumTouse;
    fnumTouse = 1;
    int nCounter;
    nCounter = 0;
    while (fnumTouse <= dUpperlimit)
    {
        if ((long)dFactorer % (long)fnumTouse == 0)
        {
            cout << fnumTouse << endl;
            fnumTouse++;
            nCounter++;
        }
        else
        {
            fnumTouse++;
        }
    }
    cout << dFactorer << endl;
    cout << "There are " << nCounter + 1 << " factors in this number";
}

int main()
{
    double dNumtofac;
    cout << "Enter a number to factor: ";
    cin >> dNumtofac;
    cout << endl;
    Factor (dNumtofac);
    return 0;
}

よし、それで、特定のことを機能させるために私がしなければならなかったすべてのキャスティングで、それが本当に見掛け倒しの仕事であることを私は知っています. それよりも小さい数でも機能しますが、1 億程度になると、完全に停止する前に特定の数の係数しか出力されなくなります。問題数を試してみたところ、その出力は数字そのものであり、この 600851475143 には 1 つの要素しかないということでした。なぜこのように言っているのか知りたいのですが、使用した変数の制限と関係があるのでしょうか。 ? 他の何か?私はこれを理解するのに十分な知識を持っていません。

4

1 に答える 1

0
#include <iostream>

using namespace std;

int main()
{
long long n=0;
//to do: verify that the number is positive and below the limit of long long
cout <<"The number to factor : ";
cin  >>n;
long long aux = n%2==0 ? 2 : 1;
for (long long i=3;i<=n/2;i+=2)
    if(n%i==0)
         aux = aux>n/i ? aux : n/i;
cout<<"Greatest factor = "<<aux;
return 0;
}

もちろん、for を高い値から低い値に変更し、因子が最初に発生した時点で停止することで、これを大幅に改善できます。n/2 が奇数か偶数かを確認することを忘れないでください。(コードをテストしませんでした)。

于 2013-11-20T12:12:16.150 に答える