Math.h
-
Hallo ihr
Ich beschäftige mich nun seid einiger Zeit mit C / C++ speziell mit einem Primzahlen Programm zum üben und verstehen vom Programmieren.
Ích bin wirklich nicht gut darin und weiss auch nicht ob ich es überhaupt bis zu komplexeren Themen schaffe.
Aber dennoch würde ich gerne folgende Formel realiesieren:
2 hoch Primzahl -1
um mal genauer zu werden hier mein derzeitiges progie:
#include <stdio.h> int main() { int i; // for variable double a=3; for(i=0;i<100;i++) { a=2^a-1; printf (" %d ",a); } // ende for schleife } // ende main funktion
Mein Problem ist, irgendwie scheint das ^ nicht für Hochrechnung zu stehen, ich weiss nicht was ich denn aus der math.h nutzten soll damit es funktioniert.
Es wäre super lieb wenn mir jemand von euch hilft. Ich sitzt schon lange drann und finde einfach nix im netz nun poste ich mal in eurem Forum.
Bis dann, Jonny.Draco
-
^ ist der Operator für die binäre Exklusiv-Oder-Verknüpfung. Du suchst die Funktion pow.
P.S.: "seit"
-
Entschuldigt ich habe es gefunden. War wohl zu ungeduldig mit dem Posten.
aber nun habe ich ein neues Problem:#include <stdio.h> #include <math.h> int main() { int i; int a=3; for(i=0;i<5;i++) { a=pow(2,a)-1; printf ("\n %d \n",a); } }
hier bekomme ich als ausgabe:
7127
-2147483648
-1
0
So ist das nicht gedacht die Zahlen sollten schon korrekt ausgegeben werten aber Int wird hier wohl gesprengt.
aber verstehen tu ich nun überhaupt nicht das:
#include <stdio.h> #include <math.h> int main() { int i; double a=3; for(i=0;i<5;i++) { a=pow(2,a)-1; printf ("\n %d \n",a); } }
Es ergibt nämlich:
00
0
0
0
Hoffe ihr klärt mich auf.
und nochmals entschuldigung, für das vorschnelle Posten ich hoffe wenigstens das gehört nicht ins Mathe Forum.
Bis dann, Jonny.Draco
-
doubles sind nicht %d sondern %e, %f oder %g
http://www.cppreference.com/stdio/printf.html
fuer lange integers probier mal "long long". der hat i.d.r. 64 bit.
-
Jonny.Draco schrieb:
So ist das nicht gedacht die Zahlen sollten schon korrekt ausgegeben werten aber Int wird hier wohl gesprengt.
Yep, so ist das. Bereits beim dritten Durchlauf entsteht eine so grosse Zahl, dass der Wertebereich von int nicht mehr ausreicht.
Was die Nullausgaben betrifft, tja, da zeigen die ...printf Funktionen wieder mal ihr hässliches Gesicht. Da du double hast, musst du das Format beim printf Aufruf entsprechend angeben.
btw:
In C sollte man Hochrechnungen, die mit Zweier-Potenz Basen arbeiten, also , , , , usw. besser mit den Shift Operatoren machen, sofern man Performance benötigt und x dafür geeignet ist.
-
Ah danke schön. Da ist mir ja ein ganz schusseliger Schusselfehler unterlaufen.
was bzw wie meinst du das denn mit den Shift Operatoren groovemaster?
alles garnicht so einfach aber ich lese mal lieber mehr jetzt. Hab ein parr gute Links hier gefunden.
Bis dann, Jonny.Draco. Und danke nochmal euch beiden das ihr geantworted habt war ja eigentlich doof von mir deswegen extra zu Posten.
-
ich würde int a statt double a nehmen, denn Primzahlen sind natürliche Zahlen und deswegen brauchst du keine Fließkommazahlen dafür.
-
supertux schrieb:
ich würde int a statt double a nehmen, denn Primzahlen sind natürliche Zahlen und deswegen brauchst du keine Fließkommazahlen dafür.
int ist aber in seiner Wertigkeit stark eingeschränkt.
-
Jonny.Draco schrieb:
was bzw wie meinst du das denn mit den Shift Operatoren groovemaster?
Diese meine ich: << >>
'pow(2, x)' wird dann zB zu '1 << x'. Die Shift Operatoren sind allerdings auf integrale Typen beschränkt. Man sollte diese aber pow immer vorziehen, sofern die Rahmenbedingungen stimmen.
-
int hat maximal 9-10 signifikante stellen (32 bit)
double hat 15-16 signifikante stellen (52 bit)
long long hat 19-20 signifikante stellen (64 bit)
-
Ich bin zwar Anfänger und habe soetwas noch nicht probiert, aber könnte er nicht %u verwenden statt int?
-
nein, weil das vollkommen verschiedene dinge sind.
wenn du keine ahnung hast, sag einfach mal nichts, okay?