Question

J'ai besoin d'aide portant révision. Il ne conserve que l'affichage 0s que la température. Merci.

// A program to determine whether the input number is a perfect number
// A perfect number is defined by the sum of all its positive divisors excluding itself
// 28: 1+2+3+7+14 = 28. 

int perfect, limit, divisor;

cout << "Please enter a positive integer in order to define whether it is a perfect integer or not: " ;
 cin >> perfect;
 cout << endl;

 int temp = 0;
 int prevtemp = 0;
  limit = 1;
  divisor = 1;
 while (limit < perfect)
 {

  if ((perfect % divisor) == 0)
   {
   divisor = prevtemp;
   temp = prevtemp + temp;
   }

  limit++;
  divisor++;
 }

 if (perfect == temp)
  cout << "Your number is a perfect number!" << endl;
 else
  cout << "Your number is not a perfect number" << endl;

 return 0;
Était-ce utile?

La solution

Je ne sais pas, mais je suppose que dans le code:

if ((perfect % divisor) == 0)
    divisor = prevtemp;

vous avez voulu que cela soit prevtemp=divisor à la place. Cela résout un problème évident, mais laisse encore un peu qui ne ressemble pas qu'il fait que vous avez probablement prévu. Par exemple, je ne peux pas tout à fait comprendre ce que limit est destiné à accomplir - vous l'initialiser et l'incrément, mais pour autant que je peux voir, vous ne utiliser sa valeur (bien, je suppose vous l'utilisez, mais sa valeur est toujours le même que celui de divisor donc je ne sais pas pourquoi vous pensez que vous avez besoin à la fois, ou comment limit a un sens comme son nom).

Edit: Il serait logique d'avoir un limit. facteurs entrent toujours en particulier, par paires: celui qui est inférieur ou égal à la racine carrée du nombre, et qui correspond à la première qui est toujours supérieure ou égale à la racine carrée du nombre. En tant que tel, vous n'avez pas besoin de scanner tout le chemin jusqu'au nombre lui-même à la recherche de facteurs - vous pouvez définir la racine carrée du nombre comme la limite, et analyse uniquement jusqu'à ce moment-là. Pour chaque chose que vous trouvez à ce moment-là, le facteur correspondant sera perfect/divisor. Puisque vous avez déjà obtenu un exemple de travail, je pense que je pourrais tout aussi bien espère que ce ne sont pas les devoirs, et après un exemple ainsi:

bool is_perfect(int number) { 
    int limit = sqrt((double)number);
    int sum = 1;

    for (int i=2; i<=limit; i++)
        if (number % i == 0) 
            sum += i + number/i;
    return sum == number;
}

Autres conseils

Vous définissez jamais prevtemp autre chose que 0, ce qui ajoute à temp ne fait rien.

Je crois que vous vouliez dire

if ((perfect % divisor) == 0) 
    temp += divisor; // not "divisor = prevtemp;"

doit également être supprimée La ligne "temp = prevtemp + temp" avec cette solution; il n'y a plus besoin de la variable prevtemp.

En outre, il n'y a pas besoin de garder limit séparés et les variables divisor, car ils sont toujours les mêmes. Il suffit de retirer limit et changer la condition de la boucle à utiliser divisor.

En outre, comme Mark Byers a souligné, la boucle serait plus simple à comprendre si vous refactorisé dans une boucle de for plutôt que d'un while.

Il semble que vous faites trop compliqué. Voici comment vous pouvez le faire:

int total = 0;
for (int i = 1; i < perfect; ++i)
{
    if (perfect % i == 0)
        total += i;
}

if (perfect == total)
    cout << "Your number is a perfect number!" << endl;
else
    cout << "Your number is not a perfect number" << endl;

Notez que le total en cours d'exécution est maintenue dans une variable appelée total (vous avez appelé cette température variable) et il est seulement augmenté lorsque le nombre est un diviseur exact.

Vous n'êtes jamais rien assignant à prevtemp après l'initialisation à 0, donc il n'y a rien à ajouter à temp sur la ligne qui lit temp = prevtemp + temp.

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

int main(){
    int n,i=1,sum=0;
    cout<<"Enter a number: ";
    cin >> n;
    while(i<n){
        if(n%i==0)
            sum=sum+i;
        i++;
    }
    if(sum==n)
         cout << i  <<  " is a perfect number";
    else
         cout << i << " is not a perfect number";
    system("pause");
    return 0; 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top