/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Udregning af primtal.
Fra : Felix Nielsen


Dato : 31-03-04 21:50

Jeg har gjort et ihærdigt forsøg på at skrive et program i C, men uden
held. Jeg er endnu ikke særlig habil til sproget, og jeg er derfor på
mange punkter stødt ind i problemer, jeg leder derfor efter en der
evt. kunne tænke sig at skrive programmet for mig, så jeg kan lære
lidt af at se i koden.

Hvis der er en der vil gøre mig den tjeneste, der iøvrigt ikke skulle
være den helt store udfordring for en habil C programør, har jeg
forsøgt, med ord, at forklare præcist hvordan det skal fungere, og
dette kan læses her under.

-----

tallene 2, 3, 5 og 7 bliver som standard tilføjet et array eller
lignende.

Selve udregningen starter ved tallet 9 som bliver testet opimod alle
primtal, dog med untagelse af 2, der er mindre eller lig med
kvardratroden af tallet selv. I dette tilfælde er det eneste primtal
der skal testes opimod derfor 3, og da 3 går op i 9, har vi nu bevist
at 9 ikke er et primtal.
Herefter bliver der lagt 2 til tallet der skal testes, og det giver
naturligvis 11, og da 3 ikke går op i 11, er 11 et primtal, og skal
derfor tilføjes til samlingen.
Når vi når til tallet 25, vil det blive nødvendig at teste op imod
både 3 og 5, da kvardratroden af 25 jo er 5. Vi vil opdage at 3 ikke
går op i 25, og er derfor indtil videre et primtal, men vi skal også
huske at teste det op imod 5, og derved bliver der slået hul i den
formodning.

Sådan fortsætter det, enten i det uendelige, op til et givent punkt,
eller med tidsbegrænsning.

Med hensyn til udskrivning af tallende, så kunne jeg tænke mig at alle
primtallende for det første bliver tilføjet et tekst dokument, men
også at det sidst fundne primtal står på skærmen, under udregningen.

Jeg har selv lavet stort set det samme i php, men er stødt ind i
problemer i mit forsøg på at omsætte det til c++. Problemerne består
henholdsvis af hvor store værdier variablerne kan indeholde, og
håndtering af de allerede fundne primtal, de skal jo gemmes på den ene
eller den anden måde, for at de kan blive brugt i testen af de
potientielle primtal.

-----

Hvis det er muligt at sende koden til mig på min email, når den er
færdig, ville det være at foretrække. <felixnielsen@hotmail.com>

På forhånd tak.

 
 
Bertel Brander (31-03-2004)
Kommentar
Fra : Bertel Brander


Dato : 31-03-04 22:20

>
> Jeg har selv lavet stort set det samme i php, men er stødt ind i
> problemer i mit forsøg på at omsætte det til c++. Problemerne består
> henholdsvis af hvor store værdier variablerne kan indeholde, og
> håndtering af de allerede fundne primtal, de skal jo gemmes på den ene
> eller den anden måde, for at de kan blive brugt i testen af de
> potientielle primtal.
>

Hvor store prim-tal skal du kunne udregne?

En std::vector kunne bruges til at gemme tallene i.

Jeg tror at du vil få mest ud af det hvis du viser os hvad
du har lavet, så kan vi gå videre derfra.

Hvis du samtidig kan overbevise os om at det ikke er hjemmearbejde
og kan forklare hvorfor din PHP løsning ikke kan bruges, tror jeg
at chancen for at få hjælp er større.

/b

Felix Nielsen (01-04-2004)
Kommentar
Fra : Felix Nielsen


Dato : 01-04-04 06:23

Bertel Brander <bertel@post4.tele.dk> wrote in message news:<406b34d7$0$227$edfadb0f@dread12.news.tele.dk>...
> >
> > Jeg har selv lavet stort set det samme i php, men er stødt ind i
> > problemer i mit forsøg på at omsætte det til c++. Problemerne består
> > henholdsvis af hvor store værdier variablerne kan indeholde, og
> > håndtering af de allerede fundne primtal, de skal jo gemmes på den ene
> > eller den anden måde, for at de kan blive brugt i testen af de
> > potientielle primtal.
> >
>
> Hvor store prim-tal skal du kunne udregne?
>
Så store som muligt, der skal reelt ikke være nogen begrænsning.

> En std::vector kunne bruges til at gemme tallene i.
>
Skal nok være rigtigt, men jeg ved ikke engang hvad det betyder.

> Jeg tror at du vil få mest ud af det hvis du viser os hvad
> du har lavet, så kan vi gå videre derfra.
>
Jeg har postet en anden trår, hvori min php kode befinder sig.

> Hvis du samtidig kan overbevise os om at det ikke er hjemmearbejde
> og kan forklare hvorfor din PHP løsning ikke kan bruges, tror jeg
> at chancen for at få hjælp er større.
>
Jeg kan forsikre om at det ikke har noget som helst med hjemmearbejde
at gøre, eller det er naturligvis som man ser på det. Jeg går ikke i
skole af nogen art i øjeblikket, dog prøver jeg hele tiden på at
"uddande" mig selv, henholdsvis i matematik og programering, jeg er
efterhånden blevet en rimelig habil webprogrammør, men jeg kunne godt
tænke mig at lave andet end hjemmesider, da det kan blive lidt
trivielt i længden, og da jeg er meget intereseret i matematik, ikke
mindst primtal, var det jo oplagt at forsøge at lave et program der
udregnede primtal. Jeg forsøgte først i php, og da gik det jo næsten
af sig selv, men da jeg skulle til at studere C blev det jo straks
noget mere indviklet. Summa sumarum, det hele er ren og skær interesse
for henholdsvis primtal og programering.
> /b

Niels Dybdahl (01-04-2004)
Kommentar
Fra : Niels Dybdahl


Dato : 01-04-04 12:52

> Jeg går ikke i
> skole af nogen art i øjeblikket, dog prøver jeg hele tiden på at
> "uddande" mig selv, henholdsvis i matematik og programering,

I så fald er det bedst at finde en bog eller lignende om C++.

Niels Dybdahl



Felix Nielsen (01-04-2004)
Kommentar
Fra : Felix Nielsen


Dato : 01-04-04 17:51

"Niels Dybdahl" <ndy@removethisesko-graphics.com> wrote in message news:<406c026b$0$166$edfadb0f@dtext02.news.tele.dk>...
> > Jeg går ikke i
> > skole af nogen art i øjeblikket, dog prøver jeg hele tiden på at
> > "uddande" mig selv, henholdsvis i matematik og programering,
>
> I så fald er det bedst at finde en bog eller lignende om C++.
>
> Niels Dybdahl

Jeg har en bog, og jeg arbejder på sagen, jeg kunne bare godt tænke
mig at have et fungerende eksempel, så jeg ved nogenlunde hvad der er
af muligheder og begrænsninger.

Nicolai Hansen (01-04-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 01-04-04 14:16

> Summa sumarum, det hele er ren og skær interesse
> for henholdsvis primtal og programering.

Jeg vil så komme med en kommentar som ikke har noget med programmering
at gøre ;)

I mine øjne bør du ikke bruge kvadratrødder til udregning af primtal.
Gør istedet således:

Du starter i din algoritme med tallet 9. Det er 3x3(kan vel næppe
overraske andre end ansatte i Told&Skat?). Det næste primtal i rækken
er 5. 5x5=25. Alle tal op til 25 skal derfor tjekkes mod primtallene
op til (og med) 3. Fra 25 til næste kvadrat (7x7=49) skal alle tallene
tjekkes mod primtallene op til (og med) 5.
[Bemærk her at alle primtal (pånær 2) er ulige tal, og deres kvadrater
(pånær 2x2=4) derfor også er ulige.]

En pseudo kode implementation af ovenstående kunne se således ud:

testTal=9;
maxPrim=3;
kvadratPrim=maxPrim*maxPrim;

gentag følgende til du ikke gider mere
{
if (testTal==kvadratPrim)
{
find næste maxPrim
kvadratPrim=maxPrim*maxPrim;
}
else
{
testPrim=3;
while (testPrim<=maxPrim)
{
test for rest ved division testTal/testPrim
hvis rest find næste testPrim
}
hvis testPrim>maxPrim tilføj testTal til primtals liste
}
}

Felix Nielsen (01-04-2004)
Kommentar
Fra : Felix Nielsen


Dato : 01-04-04 21:07

nic@aub.dk (Nicolai Hansen) wrote in message news:<d96764ff.0404010515.2cd6fa8b@posting.google.com>...
> > Summa sumarum, det hele er ren og skær interesse
> > for henholdsvis primtal og programering.
>
> Jeg vil så komme med en kommentar som ikke har noget med programmering
> at gøre ;)
>
> I mine øjne bør du ikke bruge kvadratrødder til udregning af primtal.
> Gør istedet således:
>
> Du starter i din algoritme med tallet 9. Det er 3x3(kan vel næppe
> overraske andre end ansatte i Told&Skat?). Det næste primtal i rækken
> er 5. 5x5=25. Alle tal op til 25 skal derfor tjekkes mod primtallene
> op til (og med) 3. Fra 25 til næste kvadrat (7x7=49) skal alle tallene
> tjekkes mod primtallene op til (og med) 5.
> [Bemærk her at alle primtal (pånær 2) er ulige tal, og deres kvadrater
> (pånær 2x2=4) derfor også er ulige.]
>
> En pseudo kode implementation af ovenstående kunne se således ud:
>
> testTal=9;
> maxPrim=3;
> kvadratPrim=maxPrim*maxPrim;
>
> gentag følgende til du ikke gider mere
> {
> if (testTal==kvadratPrim)
> {
> find næste maxPrim
> kvadratPrim=maxPrim*maxPrim;
> }
> else
> {
> testPrim=3;
> while (testPrim<=maxPrim)
> {
> test for rest ved division testTal/testPrim
> hvis rest find næste testPrim
> }
> hvis testPrim>maxPrim tilføj testTal til primtals liste
> }
> }


Jeg har lavet en finpudset udgave af mit php script, og det er altså
kun selve udregningen jeg her poster:

$p_array = array (2, 3, 5, 7);
$pp = 9;
do {
   $er_p = true;
   for ($a = 1; $p_array[$a] <= sqrt($pp) AND $er_p == true; $a++) {
      if ($pp % $p_array[$a] == 0) {
         $er_p = false;
      }
   }
   if ($er_p == true) {
      $p_array[] = $pp;
   }
   $pp = $pp + 2;
} while (); /* her kan man evt. skrive et argument for hvornår
udregningen skal stoppe */

Denne kode er så simpel som den kan blive, hvis man spørger mig, og
den virker.
Men hensyn til kvardratrodsproblemet så kan jeg garantere for at min
tidligere antagelse er korrekt, ikke minst fordi jeg har spurgt min
fætter til råds, og han har tilfældigvis studeret matematik. Men nok
om det.
For lige at remse problemerne op igen.

1. så længe jeg holder mig fra arrays, rækker mine evner til at
omsætte det til C, men da arrays jo ar en betydelig del af dette
script, er det naturligvis et problem.
2. Der er begrænsninger for hvor store værdier variablerne kan
indeholde, hvilket jeg også gerne vil undgå.
3. Der er et par enkelte funktioner som jeg gerne vil have lavet, det
angår blandt andet: at kunne fortsætte senere fra det punkt hvor man
valgte at stoppe programmet. At gemme værdierne i en let tilgængelig
tekst fil. At det sidst udregnede primtal står på skærmen under
udregningen, så man for en idé og hvor lang den er nået, og hvor
hurtigt et går. Alt dette er dog ikke vigtigt.

Nu skulle der ikke være noget at tage fejl af.

Bertel Brander (01-04-2004)
Kommentar
Fra : Bertel Brander


Dato : 01-04-04 22:18

Felix Nielsen wrote:
>
> 1. så længe jeg holder mig fra arrays, rækker mine evner til at
> omsætte det til C, men da arrays jo ar en betydelig del af dette
> script, er det naturligvis et problem.

Har du kikket på min løsning fra tidligere?

> 2. Der er begrænsninger for hvor store værdier variablerne kan
> indeholde, hvilket jeg også gerne vil undgå.

C og C++ garantere vist ikke at man kan regne på tal større end
4294967295. Hvis man vil bruge tal der er større må man
bruge ikke standard biblioteker. Hvilken kompiler bruger du?

> 3. Der er et par enkelte funktioner som jeg gerne vil have lavet, det
> angår blandt andet: at kunne fortsætte senere fra det punkt hvor man
> valgte at stoppe programmet.

Ikke noget problem

At gemme værdierne i en let tilgængelig
> tekst fil.

Ikke noget problem

At det sidst udregnede primtal står på skærmen under
> udregningen, så man for en idé og hvor lang den er nået, og hvor
> hurtigt et går.

I standard C++ kan man kun udskrive værdiene en linie af gangen.

/b

Lasse Westh-Nielsen (02-04-2004)
Kommentar
Fra : Lasse Westh-Nielsen


Dato : 02-04-04 00:50

> 1. så længe jeg holder mig fra arrays, rækker mine evner til at
> omsætte det til C, men da arrays jo ar en betydelig del af dette
> script, er det naturligvis et problem.

Jamen så er her en hurtig guide til brugen af arrays i C. De kan godt være
lidt irriterende

KAPITEL 1: ARRAYS

Et array i C erklæres på følgende måde (dette eksempel erklærer et array med
plads til 1000 ints):

int myArray[1000];

Elementerne er i dette tilfælde indekseret fra 0-999 og kan tilgås på
følgende måde:

myArray[7] = 42;
int i = myArray[87];

En hage ved arrays i C er at man skal specificere deres størrelse når man
erklærer dem. Men det man som regel har lyst til at gøre er noget i retning
af:

int myArray[1000];
int i = 0;
while (1) myArray[i++] = 42;

Det vil naturligvis gå galt når i når værdien 1000. I det tilfælde vil du
skrive værdien 42 et sted i hukommelsen, hvor der i virkeligheden kan stå
alt muligt andet, og måske endda noget vigtigt. Sådanne tilgange til
hukommelse du ikke er herre over kan føre til hvad som helst... Det er noget
du meget gerne vil undgå!

Hvis du på forhånd ved du kun vil have 1000 primtal så er det en fint bare
at erklære plads til 1000 ints. Hvis ikke du på forhånd ved hvor meget plads
du har brug for, så er du reelt nødt til at bruge pointere.

KAPITEL 2: POINTERE SOM ARRAYS

I C kan du skrive følgende:

int* myArray;

Det betyder, at myArray er en pointer, dvs adressen på en stump hukommelse.

For så at få fat i et stykke hukommelse du kan adressere med din nye
variabel kan du skrive:

malloc(1000);

'malloc' er en funktion der ligger i C's standardbibliotek. For at bruge den
er du nødt til at skrive:

#include <stdlib.h>

- inden du bruger 'malloc'.

'malloc' tager som parameter et tal (i bytes), som angiver størrelsen af den
stump hukommelse du ønsker. Hvis du ønsker at have hukommelse nok til 1000
ints, skal du bruge 1000*(størrelsen af een int) som parameter. Størrelsen
af en given type kan du finde ved at bruge operatoren 'sizeof'. 'malloc'
returnerer adressen på hukommelsesstumpen i form af en pointer af type void,
derfor er man nødt til at foretage et type-cast til den type man nu ønsker.
Denne adresse kan man så tildele til en variabel.

Følgende stump kode erklærer således en pointer til en stump hukommelse med
plads til 1000 ints:

#include <stdlib.h>

int* myArray = (int) malloc(1000 * sizeof(int));

For nu at tilgå dit stykke hukommelse kan du rent faktisk opfatte din
pointer som et array. Det er lidt magisk. Men ikke desto mindre.

#include <stdlib.h>

int* myArray = (int) malloc(1000 * sizeof(int));
int i = 0;
while(1) myArray[i++] = 42;

Du har dog stadig samme problem som før: hvis du skriver "ud over kanten" på
dit array så går alting galt!

KAPITEL 3: AT UDVIDE STØRRELSEN PÅ ET ARRAY

Hvis vi kigger på koden fra før kan vi se, at det hele går galt når vi løber
tør for hukommelse. Derfor ville det være rart at kunne udvide størrelsen på
vores hukommelsesstump når vi får brug for det.

Vi tæller hele tiden hvor langt vi er nået med variablen 'i', og vi ved at
når 'i' når op til 1000, er det på tide at udvide størrelsen af
hukommelsesstumpen.
Udvidelser kan man foretage med funktionen 'realloc', som er i samme familie
som 'malloc'. 'realloc' tager to parametre: adressen på den stump hukommelse
vi ønsker at udvide, og den nye størrelse vi ønsker.

Alt i alt kan vi nu skrive følgende:

#include <stdlib.h>

int* myArray = (int) malloc(1000 * sizeof(int));
int i = 0;
while(1)
{
myArray[i++] = 42;
if (i == 1000) realloc(myArray, 2000 * sizeof(int));
}

Vi har nu opnået at forstørre vores hukommelsesstump, og derved også
programmets levetid. Nu vil det først fejle, når 'i' når op til 2000...


Ovenstående skema er rigtigt dumt og kan naturligvis gøres bedre. Men det er
da en start. Hvis du vil vide mere så læs lidt i bogen: "The C Programming
Language" af Kernighan & Ritchie.

Mvh Lasse


--
Lasse Westh-Nielsen
lasse@daimi.au.dk





Byrial Jensen (02-04-2004)
Kommentar
Fra : Byrial Jensen


Dato : 02-04-04 21:04

Lasse Westh-Nielsen wrote:
> Jamen så er her en hurtig guide til brugen af arrays i C. De kan godt være
> lidt irriterende
>
> KAPITEL 2: POINTERE SOM ARRAYS
>
> 'malloc'
> returnerer adressen på hukommelsesstumpen i form af en pointer af type void,
> derfor er man nødt til at foretage et type-cast til den type man nu ønsker.

Det er man ikke nødt til. En pointer til void konverteres automatisk til
hvilken som helst pointer til en objekttype.

Udsagnet havde været rigtigt hvis du havde snakket om C++.

> For nu at tilgå dit stykke hukommelse kan du rent faktisk opfatte din
> pointer som et array. Det er lidt magisk. Men ikke desto mindre.
>
> #include <stdlib.h>
>
> int* myArray = (int) malloc(1000 * sizeof(int));
> int i = 0;
> while(1) myArray[i++] = 42;
>
> Du har dog stadig samme problem som før: hvis du skriver "ud over kanten" på
> dit array så går alting galt!

Der er også et andet problem. Måske er der ikke hukmmelse nok i systemet
til at gennemføre malloc()-kaldet. malloc() vil i så fald returnere en
pointer med den specielle værdi NULL, og en sådan pointer må (groft
sagt) ikke bruges til andet end at sammenligne med andre pointere. Der
bør indsættes en test af om værdien er NULL før man fortsætter:

int * myArray = malloc (1000 * sizeof (int));
if (myArray == NULL)
{
/* Fejlhåndteringskode indsæætes her. For eksempel: */
return;
}


> #include <stdlib.h>
>
> int* myArray = (int) malloc(1000 * sizeof(int));
> int i = 0;
> while(1)
> {
> myArray[i++] = 42;
> if (i == 1000) realloc(myArray, 2000 * sizeof(int));
> }

UPS! Det virker slet ikke.
realloc() kan flytte den tildelte hukommelse til et nyt sted i
hukommelsen, så den returnerer en pointerværdi som skal tildeles myArray.

size_t i = 0;
size_t str = 1000;
int *myArray = malloc (str * sizeof (int));
if (myArray == NULL)
{
/* Fejlhåndtering ... */
return;
}
while (1)
{
myArray[i++] = 42;
if (i == str)
{
str *= 2;
myArray = realloc (myArray, str * sizeof (int))
if (myArray == NULL)
{
/* Fejlhåndtering ... */
return;
}
}
}


Lasse Westh-Nielsen (03-04-2004)
Kommentar
Fra : Lasse Westh-Nielsen


Dato : 03-04-04 00:01

"Byrial Jensen" <bjensen@nospam.dk> wrote:

> UPS! Det virker slet ikke.
> realloc() kan flytte den tildelte hukommelse til et nyt sted i
> hukommelsen, så den returnerer en pointerværdi som skal tildeles myArray.

Ah, så lærte jeg også noget idag! Så kan jeg bedre forstå den fejl jeg fik
den anden dag...

Jeg går ud fra man kan regne med at den oprindelige chunk af hukommelse
bliver frigjort af realloc eller hvordan?

Mvh Lasse


--
Lasse Westh-Nielsen
lasse@daimi.au.dk




Byrial Jensen (03-04-2004)
Kommentar
Fra : Byrial Jensen


Dato : 03-04-04 07:54

Lasse Westh-Nielsen wrote:
> "Byrial Jensen" <bjensen@nospam.dk> wrote:
>
>>UPS! Det virker slet ikke.
>>realloc() kan flytte den tildelte hukommelse til et nyt sted i
>>hukommelsen, så den returnerer en pointerværdi som skal tildeles myArray.
>
> Ah, så lærte jeg også noget idag! Så kan jeg bedre forstå den fejl jeg fik
> den anden dag...
>
> Jeg går ud fra man kan regne med at den oprindelige chunk af hukommelse
> bliver frigjort af realloc eller hvordan?

Ja, realloc() frigiver den tidligere tildelte hukommelse og kopierer
indholdet til den nye hukommelse. Hvis realloc() fejler, returneres en
NULL-pointer. I det tilfælde er den gamle tildeling af hukommelse uberørt.

Man må i øvrigt også kalde realloc med en NULL-pointer, så viker den
ligesom malloc(). Det kan udnyttes i eksemplet i denne tråd:

size_t i = 0;
size_t str = 0;
int *myArray = NULL;
while (1)
{
if (i == str)
{
str += str + 1000;
myArray = realloc (myArray, str * sizeof (int))
if (myArray == NULL)
{
/* Fejlhåndtering ... */
return;
}
}
myArray[i++] = 42;
}


Kent Friis (03-04-2004)
Kommentar
Fra : Kent Friis


Dato : 03-04-04 09:27

Den Sat, 03 Apr 2004 08:53:57 +0200 skrev Byrial Jensen:
>Lasse Westh-Nielsen wrote:
>> "Byrial Jensen" <bjensen@nospam.dk> wrote:
>>
>>>UPS! Det virker slet ikke.
>>>realloc() kan flytte den tildelte hukommelse til et nyt sted i
>>>hukommelsen, så den returnerer en pointerværdi som skal tildeles myArray.
>>
>> Ah, så lærte jeg også noget idag! Så kan jeg bedre forstå den fejl jeg fik
>> den anden dag...
>>
>> Jeg går ud fra man kan regne med at den oprindelige chunk af hukommelse
>> bliver frigjort af realloc eller hvordan?
>
>Ja, realloc() frigiver den tidligere tildelte hukommelse og kopierer
>indholdet til den nye hukommelse. Hvis realloc() fejler, returneres en
>NULL-pointer. I det tilfælde er den gamle tildeling af hukommelse uberørt.

Det må så betyde at man ikke bør lave
myArray=realloc(myArray, str * sizeof (int));
da den vil have en memory leak hvis realloc fejler.

Det skal altså være

tmp=realloc(myArray, str * sizeof (int));
if(tmp) myArray=tmp;
else {
/* Fejlhåndtering ... */
}

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Byrial Jensen (03-04-2004)
Kommentar
Fra : Byrial Jensen


Dato : 03-04-04 12:39

Kent Friis wrote:
> Den Sat, 03 Apr 2004 08:53:57 +0200 skrev Byrial Jensen:
>>
>>Ja, realloc() frigiver den tidligere tildelte hukommelse og kopierer
>>indholdet til den nye hukommelse. Hvis realloc() fejler, returneres en
>>NULL-pointer. I det tilfælde er den gamle tildeling af hukommelse uberørt.
>
> Det må så betyde at man ikke bør lave
> myArray=realloc(myArray, str * sizeof (int));
> da den vil have en memory leak hvis realloc fejler.

Det er rigtigt. Der er også det problem at man ikke længere har adgang
til de hidtig beregnede værdier hvis man ikke har en kopi af myArray's
gamle værdi.


Jesper Louis Anderse~ (01-04-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 01-04-04 00:47

Felix Nielsen <felixnielsen@hotmail.com> wrote:
> Jeg har gjort et ih?rdigt fors?g p? at skrive et program i C, men uden
> held. Jeg er endnu ikke s?rlig habil til sproget, og jeg er derfor p?
> mange punkter st?dt ind i problemer, jeg leder derfor efter en der
> evt. kunne t?nke sig at skrive programmet for mig, s? jeg kan l?re
> lidt af at se i koden.
>


Hvad med at vise hvad du allerede har og hvor det gaar galt for dig?



--
j.

Felix Nielsen (01-04-2004)
Kommentar
Fra : Felix Nielsen


Dato : 01-04-04 05:39

Jesper Louis Andersen <jlouis@miracle.mongers.org> wrote in message news:<gs1sj1-s0f.ln1@miracle.mongers.org>...
> Felix Nielsen <felixnielsen@hotmail.com> wrote:
> > Jeg har gjort et ih?rdigt fors?g p? at skrive et program i C, men uden
> > held. Jeg er endnu ikke s?rlig habil til sproget, og jeg er derfor p?
> > mange punkter st?dt ind i problemer, jeg leder derfor efter en der
> > evt. kunne t?nke sig at skrive programmet for mig, s? jeg kan l?re
> > lidt af at se i koden.
> >
>
>
> Hvad med at vise hvad du allerede har og hvor det gaar galt for dig?

Det eneste fungerende jeg har lavet, er lavet i php, og jeg skal nok
side koden om et øjeblik. Hvad angår mine forsøg i C har jeg ikke
lavet noget der på nogen måde er værd at vise frem.

<?
$op_til = 10000000;
$p_array = array (2);
print ("2<br>\n"); // har ikke med selve udregninge at gøre.
for ($pp = 3; $pp < $op_til; $pp = $pp + 2) {
   $er_et_p = 1;
   for ($n = 1; $p_array[$n - 1] < sqrt($pp) && $er_et_p == 1; $n++) {
      if ($pp % $p_array[$n] == 0) {
         $er_et_p = 0;
      }
   }
   if ($er_et_p == 1) {
      $p_array[] = $pp;
      print ("$pp<br>\n"); // har ikke med selve udregninge at gøre.
   }
}
?>

Det kan afprøves på http://www.dagenidag.frac.dk/prim.php og så kan i
jo ved samme lejlighed beundre min hjemmeside som naturligvis bare er
adressen uden filnavnet.
Hvad angår selve scriptet, så er problemet med det i første omgang at
der er grænser for hvor store, og hvor mange værdier den kan have med
at gøre, og så er der jo alt det andet med begrænset processor
krafter, tidsbegrænsning, osv.

Det er dog ikke helt sådan jeg havde forestillet mig at det skulle se
ud i C, men da jeg er total newbie, lever jeg så at sige af jeres
vurderinger.

Bertel Brander (01-04-2004)
Kommentar
Fra : Bertel Brander


Dato : 01-04-04 19:29

Felix Nielsen wrote:

> Det eneste fungerende jeg har lavet, er lavet i php, og jeg skal nok
> side koden om et øjeblik. Hvad angår mine forsøg i C har jeg ikke
> lavet noget der på nogen måde er værd at vise frem.
>
> <?
> $op_til = 10000000;
> $p_array = array (2);
> print ("2<br>\n"); // har ikke med selve udregninge at gøre.
> for ($pp = 3; $pp < $op_til; $pp = $pp + 2) {
>    $er_et_p = 1;
>    for ($n = 1; $p_array[$n - 1] < sqrt($pp) && $er_et_p == 1; $n++) {
>       if ($pp % $p_array[$n] == 0) {
>          $er_et_p = 0;
>       }
>    }
>    if ($er_et_p == 1) {
>       $p_array[] = $pp;
>       print ("$pp<br>\n"); // har ikke med selve udregninge at gøre.
>    }
> }
> ?>

Det kunne se sådan ud med C++:

#include <vector>
#include <iostream>
#include <cmath>

const unsigned int op_til = 1000000;

std::vector<unsigned int > p_array;

int main()
{
p_array.push_back(2);
std::cout << 2 << std::endl;
for(unsigned int pp = 3; pp < op_til; pp += 2)
{
bool er_et_p = true;
for(unsigned int n = 1; p_array[n - 1] < std::sqrt(pp) && er_et_p
== true; n++)
{
if(pp % p_array[n] == 0)
{
er_et_p = false;
}
}
if(er_et_p)
{
p_array.push_back(pp);
std::cout << pp << std::endl;
}
}
return 0;
}

Jesper Louis Anderse~ (02-04-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 02-04-04 01:19

Bertel Brander <bertel@post4.tele.dk> wrote:

Og saa lige en C-version:

/* Calculate primes without the use of modulo, division or any other
* potentially slow operation (eg, sqrt)
* Jesper Louis Andersen, adapted from Knuth, The art of computer programming
* volume 2, seminumerical algorithms
*/

#include <stdio.h>
#include <stdlib.h>

#define PRIMESIZE 1001

/* A trick is that slot k means that 2k+1 is a prime */
unsigned short int primes[PRIMESIZE];

void
calcPrimes()
{
int p = 3, q = 4; /** We have the invariants p = 2j+1, q = 2j + 2(j^2)
                * in each iteration of the loop
                */
int k, j = 1;

/* Initialize the array of primes */
for (int i = 0; i < PRIMESIZE; i++) {
   primes[i] = 1;
}

do {
   
   if (primes[j] == 1) { /* If slot j contains 1, p is a prime */
    printf("%d\n", p); /* print out prime p */
    k = q; /** Optimization, the first non-prime to consider is
                   * 2*q+1
                   */
    /* Sieve numbers. Start from 2*q+1 and then kill numbers of the form
    * 2*(q + (p*n))+1 for 1 <= n up to PRIMESIZE
* That is, we increase by 2*p in each iteration of the loop and square
    * that number out
    */
    while (k < PRIMESIZE) {
      primes[k] = 0;
      k+=p;
    }
   }

   /* update the invariants
    * Note:
    *
    * p = 2j+1, Look at: 2(j+1)+1 => 2j+2+1
    * so 2j+2+1 - p = 2j+2+1 - (2j+1) = 2
    * which justifies that p increases by 2
    * q = 2j+2(j^2), Look at: 2(j+1) + 2((j+1)^2)
    * = 2j+2 + 2(j^2+1+2j
    * = 2j+2 + 2j^2 + 2 + 4j
    * = 2j^2 + 6j + 4
    * so 2j^2 +6j + 4 - q
    * = 2j^2 + 6j + 4 - (2j+2j^2)
    * = 4j + 4
    * Now, what is 2*p - 2?
    * 2p - 2 = 2(2(j+1)+1) - 2
    * = 2(2j+2+1) - 2
    * = 4j+4+2-2
    * = 4j+4
    * which justifies that q increases by 2p-2
    */
   j++; p+=2; q+= 2*p - 2;
} while ( j <= PRIMESIZE );
}

int
main()
{
calcPrimes();

return EXIT_SUCCESS;
}

Det er ogsaa vaerd at checke saadan noget som FreeBSDs spilarkiv:

http://www.freebsd.org/cgi/cvsweb.cgi/src/games/primes/
--
j.

Byrial Jensen (02-04-2004)
Kommentar
Fra : Byrial Jensen


Dato : 02-04-04 20:51

Jesper Louis Andersen wrote:
>
> Og saa lige en C-version:
>
> /* Calculate primes without the use of modulo, division or any other
> * potentially slow operation (eg, sqrt)
> * Jesper Louis Andersen, adapted from Knuth, The art of computer programming
> * volume 2, seminumerical algorithms
> */

Den brugte algoritme hedder Eratosthenes' si og stammer fra oldtiden.


Jesper Louis Anderse~ (03-04-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 03-04-04 01:26

Byrial Jensen <bjensen@nospam.dk> wrote:
>
> Den brugte algoritme hedder Eratosthenes' si og stammer fra oldtiden.

Ja, det burde have fremgaaet. Samme princip med lidt optimering hist
og her. Jeg tvivler dog paa at det har nogen betydning i praksis om
man vaelger den ene eller den anden metode.

--
j.

Kent Friis (01-04-2004)
Kommentar
Fra : Kent Friis


Dato : 01-04-04 21:24

Den 31 Mar 2004 12:49:48 -0800 skrev Felix Nielsen:
>Jeg har gjort et ihærdigt forsøg på at skrive et program i C,

>Jeg har selv lavet stort set det samme i php, men er stødt ind i
>problemer i mit forsøg på at omsætte det til c++.

Du bør starte med at beslutte hvorvidt du vil bruge C eller C++.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste