2017-07-20 6 views
-2

Imはthisプログラミング上の問題を解決しようとしています。 ここに質問があります。 13195のプライム要因プログラム(C++)の失敗

素因数5、7、13および29

番号600851475143の最大素因数は何ですか?その5.で立ち往生実行しながら

は今、私はここで、プログラム

#include <iostream> 
#include <math.h> 
using namespace std; 
const long long no = 600851475143; 

long long isprime(long long p) 
{ 
    long long reply = -1; 
    long long i = 2; 
    while (i < pow(p, 0.5)) { 
     if (i % p == 0) 
      reply = i; 
    } 
    if (reply == -1){ 
    return 0; 
    cout<<" yup its prime "<<endl; 
    } 

    else 
     return reply; 
} 

long long factor(long long x) 
{ 
    for (long long i = 2; i < no; i++) { 
    cout<<"Trying "<<i<<endl; 
     if ((isprime(i) == 0)&& (no % i == 0)) { 
      return i; 
     cout<<"found "<<i<<endl; 
      break; 
     } 
    } 
} 

int main() 
{ 
    long long ans = no; 
    while (ans != 1) { 
     cout << factor(ans) << endl; 
     ans = ans/factor(ans); 
    } 
} 

である、しかし、力ずくでそれを確認しようとするC++プログラムを、でっち上げてきたし、これが出力されます

~/Desktop/proj$ ./a.out 

Trying 2 
Trying 3 
Trying 4 
Trying 5 

私は本当になぜ番号5で立ち往生しているのか理解できません。

編集:ありがとうb13rg、私は間違いを認識した。私は今、より良いアルゴリズムを持っている、私はそれを必要とする誰のためにそれを貼り付けている。

#include<iostream> 
#include<math.h> 
using namespace std; 

long long fun (long long x) 
{ 
    for(long long i=2; i<sqrt(x);i++){ 
    while (x%i==0){ 
     cout<<i<<endl; 
     x=x/i; 
     } 
    } 
} 

int main(){ 

fun(600851475143); 


return 0;} 
+0

これらの問題を解決するには、デバッガを使用する方法を学んでください。閉鎖の質問に印を付ける。 – Mahesh

答えて

0

関数isprimeのwhileループでiまたはpの値を決して変更しないようです。 sqrt(5)が2より大きく、whileループの何も変わらないので失敗します。

あなたが解決しようとしている問題については

:あなたは、それはより速く、あなたはできるようにするには、その後5など、3、その後、最初の奇数のみを試みることによって確認ループを最適化するので、最初の2を行うことができ

最初のいくつかの素数ではハードコードですが、それはこのプロジェクトの範囲を超えているかもしれません。

最大の素因数を見つけるには、まず最小の素因数を見つけたいと思うでしょう。例えば、上記の数値の中で最小のものは5です。次のステップは、13195を5で割って2369を得ることです。次に、この数値の最小の素因数を見つけなおして、分割結果が素数になるまで続けます。

Number|Smallest prime 
------|-------------- 
13169 | 5 
2369 | 7 
377 |13 
29 |Largest prime factor of 13169 
関連する問題