2016-02-07 6 views
6

Programmnummer 1: In einem bestimmten Bereich ein und b wo eine < = b, mag ich, ob eine Zahl zu finden ist ein perfektes Quare, wenn ja dann drucken Sie seine Wurzel. Deshalb schrieb ich den folgenden Code:Perfekte Quadrate in einem bestimmten Bereich: abnormal Ausführung von Schleifen

#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; 
} 

Für die gegebene Eingabe 1 5 der Ausgang 2 sein sollte. Aber das obige Programm druckt keinen Wert.


Trotzdem, als ich versuchte, ein anderes Programm läuft unter Verwendung der gleichen Basiskonzept als Programmnummer 1, das oben erwähnt wird, wurde perfekt ausgeführt. Die Aufgabe für das folgende Programm ist es, zu überprüfen, ob die Eingabe ein perfektes Quadrat ist oder nicht. Wenn ja, dann drucke die Wurzel der Zahl, sonst drucke "Kein perfektes Quadrat!". Hier ist der Code für die Programmnummer 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; 
} 

Ich bin nicht in der Lage die Fehler im ersten Programm zu finden. Bitte helfen Sie.

+1

Wenn Sie in ganzen Zahlen interessieren, warum verwenden Sie * float *? Der Typ float ist gut genug für einfache Berechnungen, bei denen Sie Rundungsfehler akzeptieren können. aber sonst ist es nichts als Ärger. –

+0

@Gyro Düsentrieb Es gibt viele mögliche Wege, das obige Problem zu lösen. Aber die Hauptabsicht, diese Frage zu stellen, ist zu wissen, warum die _for_ und/oder _if_ Schleife in ** Programm 1 ** sich unnormal verhält. P.S. Der Titel der Frage wurde entsprechend geändert. –

Antwort

3

Wie Gyro Düsentrieb sagte, ist das Problem, dass 1.99999809 zurückgibt, so floor(roo)!=roo. Eine Möglichkeit, dies zu beheben, besteht darin, die Bedingung (floor(roo)==roo) in (fabs(roo - floor(roo+0.5)) < 0.00001) zu ändern. Beachten Sie, dass ich dieselbe 0.00001 von der Funktion squaredroot verwende.

+0

Typo: du meinst 'squaredroot (4)' – jadhachem

+0

Danke :-). Fest. –

+0

Für den gleichen Eingang, wie in der Frage erwähnt, ist die Ausgabe von ** Programm1 ** nach der vorgeschlagenen Änderung '0.999992' '2'. Die gewünschte Ausgabe ist 2 (sollte eine ganze Zahl sein). Noch ist die Frage, wenn ** Programm 2 ** in der Lage war, "2" für "squaredroot (4)" zu drucken, dann warum ** Programm 1 ** dies nicht tut. –

4

Statt etwa mit der Quadratwurzel-Funktion von Messing, halten dies:

  • konsekutiv Quadrate durch nachfolgende ungerade Zahlen getrennt sind.
  • Es ist verdammt schnell, einige ganze Zahlen hinzuzufügen. Außerdem überspringen Sie jedes Mal mehr und mehr Zahlen.
  • Quadratwurzel bringt Sie zu schweben. Dies hält das Problem in ganzen Zahlen, wo es hingehört.

So, Ihr Problem elegant zu lösen, tun nur dies:

#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

Das funktioniert ganz gut. Dennoch ist die Frage, was mit ** Programm 1 ** falsch ist. Der Fehler muss in der _for_ -Schleife sein. –

+0

@RaviKiran Wenn die zurückgegebene Quadratwurzel nicht genau ist, unterscheidet sich die floor-Funktion von der Quadratwurzel, was dazu führt, dass Sie diese Ausgabe nicht korrekt ausgeben. – Carlos

Verwandte Themen