Gå til innhold

C-kode for å finne primtall krasjer


Anbefalte innlegg

Følgende korte kodesnutt for å finne primtall nr. 10001 (en oppgave fra nettstedet Project Euler) krasjer (i form av at windows sier "core.exe has stopped working"). Ser noen hvorfor?

 

#include <stdio.h>

#include <stdlib.h>

 

int count, number=0, test;

 

int main(){

 

for(count=1; number<=10001; count++){

prime_test();

}

return 0;

 

}

 

 

int prime_test(){

for(test=0; test<=0.5*count; test++){

if(count%test==0 && test!=1){

return 0;

}

}

 

number++;

printf("%d. prime number: %d\n", number, count);

return 0;

}

 

Edit: Endret vilkårene for if-testen da jeg fant en logisk feil. Et vilkår for if-testen må også være at test!=1 da alle naturlige tall er delbare med 1, selv primtallene. Programmet fungerer likevel ikke.

Endret av Dr. Chaos
Lenke til kommentar
Videoannonse
Annonse

Feilen din ligger i

count % test

. Her får du en floating point exception fordi test er 0 helt til å begynne med. Husk at a % b gir deg resten etter å ha delt a på b. Du har ikke lov å dele på 0, og derfor gir dette en feil når test er 0. Hvorfor kan du ikke la test begynne på 1 i stedet?

 

EDIT: når dette er sagt, så er koden din litt uryddig (jeg antar du holder på å lære C?) Hvorfor er f.eks. variablene globale? Husk at du kan sende argumenter til funksjoner i stedet for å la alle funksjonene dele de globale variablene.

Endret av Jaffe
Lenke til kommentar

Feilen din ligger i

count % test

. Her får du en floating point exception fordi test er 0 helt til å begynne med. Husk at a % b gir deg resten etter å ha delt a på b. Du har ikke lov å dele på 0, og derfor gir dette en feil når test er 0. Hvorfor kan du ikke la test begynne på 1 i stedet?

:blush:

 

EDIT: når dette er sagt, så er koden din litt uryddig (jeg antar du holder på å lære C?) Hvorfor er f.eks. variablene globale? Husk at du kan sende argumenter til funksjoner i stedet for å la alle funksjonene dele de globale variablene.

Ja, jeg har i perioder holdt på med å lære meg det. Jeg gjorde variablene globale da jeg så på det som enkelt i denne situasjonen. Må tvinge meg selv til å lese mye mer dokumentasjon før jeg hopper på oppgaver heretter. :wallbash:

Lenke til kommentar

Det er ikke enkelt med globale variabler. Du bare tror det er enkelt ^^ Globale variabler er en gigantisk fallgruve av feil som er vanskelig å debugge, og programmet ditt KAN IKKE være multithreaded slik det er laget nå, til tross for at det kunne gitt programmet ditt et mangfoldig ganger ytelsesforbedring. Bruk det kun når du har en forbanna god grunn for å bruke dem (og ikke fordi det virker enkelt)!

Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...