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;
È stato utile?

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; 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top