2016-02-07 16 views
6

programma numero 1: In un determinato intervallo un e b dove un < = b, voglio trovare se un numero è una quare perfetta, se sì allora stampa la sua radice. Pertanto, ho scritto il seguente codice:quadrati perfetti in un dato intervallo: esecuzione anormale di loop

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
using namespace std; 
float squaredroot(int n) { 
float low = 0.0, mid; 
float high = (float)n+1; 
while ((high-low) > 0.00001) { 
    mid = (low+high)/2; 
    if (mid*mid < n) { 
     low = mid; 
    } 
    else { 
     high = mid; 
    } 
} 
return low; 
} 

int main() { 
int a,b,i=0; cin>>a>>b; 
float roo=0.0; 
for(i=a;i<=b;i++){ 
roo=squaredroot(i); 
    if(floor(roo)==roo){ 
     cout<<roo<<endl; 
    } 
} 
return 0; 
} 

Per la data di ingresso 1 5 l'uscita dovrebbe essere 2. Ma il programma sopra non sta stampando alcun valore.


Tuttavia, quando ho provato in esecuzione un altro programma utilizzando lo stesso concetto base come numero Programma 1, che è già accennato, è stato eseguito perfettamente. L'attività per il seguente programma è di verificare se l'input è un quadrato perfetto o meno. Se sì, stampa la radice del numero, altrimenti stampa "Non un quadrato perfetto!". Ecco il codice per il numero Programma 2:

#include <cmath> 
#include <cstdio> 
#include <vector> 
#include <iostream> 
using namespace std; 
float squaredroot(int n) { 
float low = 0.0, mid; 
float high = (float)n+1; 
while ((high-low) > 0.00001) { 
    mid = (low+high)/2; 
    if (mid*mid < n) { 
     low = mid; 
    } 
    else { 
     high = mid; 
    } 
} 
return low; 
} 

int main() { 
int a; cin>>a; 
float roo=0.0; 
roo=squaredroot(a); 
if(floor(roo)==roo){ 
    cout<<roo<<endl; 
} 
else{ 
    cout<<"Not a perfect square!"<<endl; 
} 
return 0; 
} 

non sono in grado di trovare l'errore nel primo programma. Per favore aiuto.

+1

Se siete interessati a numeri interi, perchè si usa * * galleggiante? Il tipo float è sufficiente per calcoli semplici in cui è possibile accettare alcuni errori di arrotondamento; ma da nessun'altra parte non è altro che guai. –

+0

@Gyro Gearloose Ci possono essere molti modi possibili per risolvere il problema precedente. Ma l'intenzione principale di porre questa domanda è sapere perché il ciclo _for_ e/o _if_ nel ** Programma 1 ** si sta comportando in modo anomalo. Post scriptum Modificato di conseguenza il titolo della domanda. –

risposta

3

Come ha detto Gyro Gearloose, il problema è che squaredroot(4) restituisce 1.99999809, quindi floor(roo)!=roo. Un modo per risolvere questo problema è modificare la condizione (floor(roo)==roo) in (fabs(roo - floor(roo+0.5)) < 0.00001). Si noti che sto utilizzando lo stesso 0.00001 dalla funzione squaredroot.

+0

Typo: intendi 'squaredroot (4)' – jadhachem

+0

Grazie :-). Fisso. –

+0

Per lo stesso input, come menzionato nella domanda, l'output del ** Program1 ** dopo la modifica suggerita è '0.999992'' 2'. L'output desiderato è 2 (dovrebbe essere un numero intero). Tuttavia, la domanda è, se ** Programma 2 ** è stato in grado di stampare '2' per' squaredroot (4) ', allora perché ** programma 1 ** non riesce a farlo. –

4

Invece di modificare con la funzione di radice quadrata, considerare questo:

  • piazze consecutivi sono separati riuscendo numeri dispari.
  • È dannatamente veloce aggiungere alcuni numeri interi. Inoltre stai saltando sempre più numeri ogni volta.
  • La radice quadrata ti porta a galleggiare. Ciò mantiene il problema nei numeri interi, a cui appartiene.

Così, per risolvere il problema con eleganza, basta fare questo:

#include <iostream> 

using std::cout; 

void print_perfect_square(int start, int end) { 
    int x = 0, nthOdd = 1; 

    while (x <= end) { 
     if (x >= start) { 
      cout << x << " is a square and its root is " 
       << nthOdd - 1 << '\n'; 
     } 
     x += 2*nthOdd - 1; 
     ++nthOdd; 
    } 
} 

int main() { 
    // it should find 9 and 16 
    print_perfect_square(6,17); 
    cout << '\n'; 
    // it sholuld skip negatives 
    print_perfect_square(-10,5); 
    cout << '\n'; 
    // it should print 25,36... 
    print_perfect_square(20,100); 
    return 0; 
} 
+0

Funziona perfettamente. Tuttavia, la domanda è cosa c'è di sbagliato con ** Programma 1 **. L'errore deve essere nel ciclo _for_. –

+0

@RaviKiran se la radice quadrata restituita non è esattamente esatta, la funzione di base sarà diversa dalla radice quadrata, causando la perdita di quell'output in modo errato. – Carlos

Problemi correlati