C Nombre de parfait. Vous avez besoin d'aide révision
-
20-09-2019 - |
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;
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;
}