C: Große ganzzahlige Datentypen

Neue Frage »

Auf diesen Beitrag antworten »
nano99 C: Große ganzzahlige Datentypen

Meine Frage:
Hi!

Ich möchte ein C-Programm schreiben, dass alle Primzahlen ab einer bestimmten Zahl ausgibt.
Bis jetzt bin ich so weit:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
#include <stdio.h>

int main()
{
 int geht;
 long beginn,currnr,i,currbisnr;
 scanf("%d",&beginn);
 printf("\n\nAb %d gibt es folgende Primzahlen:\n",beginn);
 currnr=beginn;
 
 while(1)
 {
  currbisnr=currnr/2+1;
  geht=1;
  for(i=2; i<=currbisnr; i++)
  {
   if(currnr%i==0)
   {
    geht=0;
   }
  }
  if(geht==1)
  {
   printf("%d\n",currnr);
  }
  currnr++;
 }
}


Nun mein Problem: Wenn der Zähler bei der Zahl 32000 (oder so) angekommen ist, geht die Zählung plötzlich bei -32000 weiter. Das ist so, weil der Datentyp long nur so weit kommt. Um das Problem zu lösen, habe ich schon versucht, statt "long" "double" zu verwenden. Dann wird mir aber bei der Modulo-Funktion (Zeile 17) der Fehler "Illegal use of floating point" angezeigt, weil Modulo ja nur mit ganzen Zahlen arbeiten kann. Gibt es jetzt irgendeine Möglichkeit, entweder einen riesigen ganzzahligen Datentyp zu verwenden, oder Modulo mit "double" zu verwenden?

Danke schon mal für Antworten smile

Gruß,
nano99

Meine Ideen:
Siehe oben großes Grinsen
 
Auf diesen Beitrag antworten »
eulerscheZahl

Das gibt dir die Maximalwerte aus:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
#include <stdio.h>
#include <limits.h>

int main()
{
    printf("INT_MAX = %d\n", INT_MAX);
    printf("LONG_MAX = %d\n", LONG_MAX);

	getchar();
}

ist bei mir beides 2147483647 (da 32 Bit), bei dir auch?
Fall nicht, versuche mal folgendes:
code:
1:
2:
3:
#include <stdint.h>
...
int32_t beginn,currnr,i,currbisnr;



Zur Implementierung:
es reicht aus, wenn du in Zeile 13 sqrt(currnr) nimmst:
code:
1:
2:
3:
#include <math.h>
...
currbisnr = sqrt((double)currnr);

dann läuft es schneller
Auf diesen Beitrag antworten »
mathefritz

moderne Compiler ( C99 )
sollten, sogar auf 32Bit-Systemen, den 64-BitTyp long long kennen;
und
da ja keine negativen Werte entstehen, kannst Du auch unsigned long long nehmen
und mit Werten bis 2^64 - 1 rechnen.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »