Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Theoretische Informatik (http://www.informatikerboard.de/board/board.php?boardid=5)
--- C: Große ganzzahlige Datentypen (http://www.informatikerboard.de/board/thread.php?threadid=1521)


Geschrieben von nano99 am 07.06.2013 um 21:41:

  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



Geschrieben von eulerscheZahl am 07.06.2013 um 22:01:

 

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



Geschrieben von mathefritz am 09.06.2013 um 21:05:

 

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.


Forensoftware: Burning Board, entwickelt von WoltLab GmbH