C ++ numero perfetto. Hai bisogno di un certo aiuto di revisione
-
20-09-2019 - |
Domanda
Ho bisogno di aiuto revisione della presente. E 'solo mantiene la visualizzazione 0s come la temperatura. Grazie.
// 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;
Soluzione
Non sono sicuro, ma direi che nel codice:
if ((perfect % divisor) == 0)
divisor = prevtemp;
si intende questo per essere prevtemp=divisor
invece. Questo risolve un problema evidente, ma lascia ancora un bel po 'che non sembra che sta facendo che probabilmente desiderato. Per esempio, io non riesco a capire cosa limit
ha lo scopo di realizzare - si inizializza e incrementarlo, ma per quanto posso vedere, non hai mai USE il suo valore (Beh, credo lo si utilizza, ma il suo valore è sempre lo stesso di divisor
di così io non sono sicuro perché pensi di aver bisogno di entrambi, o come limit
ha un senso come il suo nome).
Edit: avrebbe senso avere un limit
. In particolare, i fattori sono sempre a coppie: uno che è minore o uguale alla radice quadrata del numero, e uno che corrisponde al primo che è sempre maggiore o uguale alla radice quadrata del numero. In quanto tale, non è necessario eseguire la scansione tutta la strada fino al numero stesso alla ricerca di fattori - è possibile impostare la radice quadrata del numero come limite, e solo eseguire la scansione fino a quel punto. Per ogni fattore a trovare fino a quel momento, il fattore di adattamento sarà perfect/divisor
. Dal momento che hai già ottenuto un esempio di lavoro, credo che potrei anche solo che questo non è lavoro, e posterò un esempio così:
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;
}
Altri suggerimenti
Non si è mai imposta prevtemp
a qualcosa di diverso da 0, in modo da aggiungere al temp
non fa nulla.
Credo che Lei abbia voluto dire
if ((perfect % divisor) == 0)
temp += divisor; // not "divisor = prevtemp;"
La linea "temp = prevtemp + Temp" dovrebbe anche essere rimosso con questa soluzione; non v'è più alcuna necessità per la variabile prevtemp
.
Inoltre, non v'è alcuna necessità di mantenere le variabili limit
e divisor
separati, dal momento che sono sempre gli stessi. Basta rimuovere limit
e cambiare la condizione del ciclo di utilizzare divisor
.
Inoltre, come Mark Byers ha sottolineato, il ciclo sarebbe più semplice da capire se riscritta in un ciclo for
piuttosto che un while
.
Sembra che si sta facendo è troppo complicato. Ecco come si potesse fare:
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;
Si noti che il totale corrente è conservato in un chiamato total
variabile (chiamato questa temperatura variabile) ed è aumentata soltanto quando il numero è un divisore esatto.
Non si è mai assegnando nulla per prevtemp
dopo l'inizializzazione a 0
, quindi non c'è nulla da aggiungere a temp
sulla riga che legge 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;
}