2017-06-11 4 views
0

Ce code, je suppose, me donnerait le facteur premier le plus important pour l'entrée du nombre composite. Cependant, cela fonctionne pour certaines entrées et pas pour d'autres.Le facteur de forme dans le code C++ ne fonctionne pas pour toutes les entrées

#include<iostream> 
#include<cmath> 
using namespace std; 

int main() 
{ 
int num=1, sum, count=0, test; 
cin>>test; 
while(num<=(sqrt(test))) 
{ 
    if(test%num==0) 
    { 
     for (int prime=2; num>prime; prime++) 
     { 
      if(num%prime==0) 
      count ++; 
     } 
     if (count == 0) 
      sum=num; 
    } 
    num++; 
} 
cout<<sum; 
} 

Exemples où il ne fonctionne pas:

entrée: 6, prévu: 3, a obtenu: 2;

entrée: 540, attendue: 5, prise: 3;

entrée: 600, attendue: 5, prise: 3; Est-ce que quelqu'un peut me dire quoi changer?

+1

Veuillez donner un exemple où cela ne fonctionne pas. c'est-à-dire l'entrée et ce qui est attendu –

+0

Déplacez également la condition 'sqrt' hors de la condition while pour la vitesse –

+1

Vous limitez votre recherche à des nombres ne dépassant pas' sqrt (test) '. Cela signifie que, au moins pour les nombres qui sont un produit de deux nombres premiers, vous pouvez seulement trouver le plus petit des deux. Dans ce cas, le plus petit premier est nécessairement ' = sqrt (test)' –

Répondre

2

Si vous voulez le plus grand facteur premier, vous devez vérifier tout le chemin à test/2. Par exemple. Pour 38, vous n'enregistrerez actuellement que 6, et vous en manquerez 19.

De plus, vous devez compter le nombre de repos après chaque test.

2

Vous devez ajouter

count = 0

après

if (count == 0) sum = num;

également lorsque le nombre d'entrée est premier alors le plus grand diviseur premier est le numéro d'entrée lui-même. Dans ce cas, la variable sum n'a jamais été initialisée. Init en début de programm à 0 et après boucle while ajouter

if (sum == 0) sum = test;

+0

Je pensais que ça ne fonctionnerait que pour le composite –

0

peu en retard, mais encore:

int main() { 
    auto num = 1; 
    auto sum = 0; 
    auto count = 0; 
    auto test = 0; 

    std::cin >> test; 

    while (num <= test/2) { 
    count = 0; 
    if (test % num == 0) { 
     for (auto prime = 2; num > prime; prime++) { 
     if (num % prime == 0) count++; 
     } 
     if (count == 0) sum = num; 
    } 
    num++; 
    } 
    std::cout << sum; 
} 

Vous pouvez utiliser la fonction Auto. Aussi, comme astuce générale: n'utilisez pas "using namespace std". S'habituer à écrire std :: vous évitera des problèmes lors de l'exécution de projets plus importants.