/ 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 : 01-04-04 01:43

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.

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


Dato : 03-04-04 06:06

Mange tak til jer alle sammen, jeg vil kigge lidt på kodeforslagende,
og vende tilbage hvis der er problemer...

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


Dato : 03-04-04 08:16

Så er jeg noget frem til noget, som godt nok ikke virker, men min
ringe erfaring taget i betragtning, nok er værd at vise frem.

Jeg har især et STORT problem; Jeg kan ikke finde ud af at putte
værdier i mit array, så hvis der er nogen der lige vil kigge det
igennem, så bliver jeg glad...

-------

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

main()
{
int er_p;
unsigned long int pp, a, b = 4;
unsigned long int** parray = (unsigned long int**)
malloc(sizeof(unsigned long int*) * 4);
parray[0] = 2;
parray[1] = 3;
parray[2] = 5;
parray[3] = 7;
for (pp = 9; pp > 0; pp += 2) {
er_p = 1;
for (a = 1; parray[a] <= sqrt(pp) && er_p == 1; a++) {
if (pp % parray[a] == 0) {
er_p = 0;
}
}
if (er_p == 1) {
realloc(parray, sizeof(unsigned long int));
parray[b++] = pp;
printf ("%ul\n", pp);
}
}
return 0;
}

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


Dato : 03-04-04 08:34

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

EURICA!!!
Nu har jeg rent faktisk lavet et program der virker, det stopper godt
nok når det når til 157, og er sikker fuldt af fejl, men det hvirker!
Det må da siges at være et skridt i den rigtige retning.

main()
{
int er_p;
unsigned long int pp, a, b = 4;
unsigned long int parray[4] = {2, 3, 5, 7};
printf ("2\n3\n5\n7\n");
for (pp = 9; pp > 0; pp += 2) {
er_p = 1;
for (a = 1; parray[a] <= sqrt(pp) && er_p == 1; a++) {
if (pp % parray[a] == 0) {
er_p = 0;
}
}
if (er_p == 1) {
realloc(parray, sizeof(unsigned long int));
parray[b++] = pp;
printf ("%u\n", pp);
}
}
}

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


Dato : 03-04-04 12:29

Felix Nielsen wrote:
> #include <stdio.h>
> #include <stdlib.h>
> #include <math.h>
>
> EURICA!!!
> Nu har jeg rent faktisk lavet et program der virker, det stopper godt
> nok når det når til 157, og er sikker fuldt af fejl, men det hvirker!
> Det må da siges at være et skridt i den rigtige retning.
>
> main()
> {
> int er_p;
> unsigned long int pp, a, b = 4;
> unsigned long int parray[4] = {2, 3, 5, 7};
> printf ("2\n3\n5\n7\n");
> for (pp = 9; pp > 0; pp += 2) {

Stopbetingelsen bliver aldrig opfyldt, for pp vil altid indeholde en
ulige positiv værdi.

> er_p = 1;
> for (a = 1; parray[a] <= sqrt(pp) && er_p == 1; a++) {
> if (pp % parray[a] == 0) {
> er_p = 0;
> }
> }
> if (er_p == 1) {
> realloc(parray, sizeof(unsigned long int));

1) Man kan kun reallokere arrays som tidligere er allokeret med
malloc(), realloc() eller tilsvarende funktioner, samt NULL-pointere.
Desuden skal man bruge returværdien fra realloc() som ny pointer.
2) Det anden argument er den nye størrelse af arrayet. Du sætter
størrelsen til ét element. Det er for lidt.
3) Man bør ikke kalde realloc() hver gang man har fundet et primtal
fordi realloc() vil kopiere alle tidligere fundne primat til et nyt
array hver gang det bliver kaldt hvilket er tidskrævende. Det er bedre
for eksempel at fordoble størrelsen hver gang man er ved at løbe tør for
plads.
> parray[b++] = pp;
> printf ("%u\n", pp);
> }
> }
> }


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


Dato : 03-04-04 14:11

Felix Nielsen wrote:
> printf ("%u\n", pp);

Det går heller ikke. pp er en unsigned long, hvilket formatstrengen skal
fortælle:

printf ("%lu\n", pp);

Her er min udgave af et C-program som finder primtal ved hjælp af din
algoritme.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include <math.h>

int main ()
{
size_t max = 1000;
unsigned long int *parray = malloc (max * sizeof parray[0]);
if (parray == NULL)
{
printf ("Ikke mere hukommelse\n");
return 1;
}
size_t antal = 0;
printf ("2\n");
parray[antal++] = 2;
printf ("3\n");
parray[antal++] = 3;
const unsigned long max_divisor = sqrt (UINT_MAX);
for (unsigned long int pp = 5; pp != 1; pp += 2)
{
bool er_p;
// Vi starter med i = 1 fordi parray[0] er 2 som ikke kan være
// divisor da vi kun tester ulige tal.
// Der er ingen stopbetingelse "i < antal" i løkken da vi altid
// vil forlade løkken fra en af de to break-sætninger før
// den ville være opfyldt.
for (size_t i = 1 ; ; i++)
{
unsigned long int divisor = parray[i];
if (divisor > max_divisor || divisor * divisor >= pp)
{
   er_p = true;
   break;
}
if (pp % divisor == 0)
{
   er_p = false;
   break;
}
}
if (er_p)
{
if (antal == max)
{
   max *= 2;
   unsigned long int *res
= realloc (parray, max * sizeof parray[0]);
   if (res == NULL)
   {
    printf ("Ikke mere hukommelse\n");
    break;
   }
   parray = res;
}
parray[antal++] = pp;
printf ("%lu\n", pp);
}
}
free (parray);
}


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


Dato : 04-04-04 18:57

> Her er min udgave af et C-program som finder primtal ved hjælp af din
> algoritme.
>
Jeg er meget glad for det besvær du har gjort dig, men det virker altså ikke.

[Warning] In function `int:
10 invalid conversion
21 [Warning] initialization
21 [Warning] argument
50 invalid conversion

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


Dato : 04-04-04 19:19

Felix Nielsen wrote:

>>Her er min udgave af et C-program som finder primtal ved hjælp af din
>>algoritme.
>>
>
> Jeg er meget glad for det besvær du har gjort dig, men det virker altså ikke.
>
> [Warning] In function `int:
> 10 invalid conversion
> 21 [Warning] initialization
> 21 [Warning] argument
> 50 invalid conversion

Hvis du kompilerer det som et C++ program skal du caste retur
værdien fra malloc og realloc:

unsigned long int *parray =
(unsigned long int *)malloc (max * sizeof parray[0]);


unsigned long int *res =
(unsigned long int *)realloc (parray, max * sizeof parray[0]);

/b

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


Dato : 04-04-04 23:47

Bertel Brander <bertel@post4.tele.dk> wrote in message news:<40705093$0$202$edfadb0f@dread11.news.tele.dk>...
> Felix Nielsen wrote:
>
> >>Her er min udgave af et C-program som finder primtal ved hjælp af din
> >>algoritme.
> >>
> >
> > Jeg er meget glad for det besvær du har gjort dig, men det virker altså ikke.
> >
> > [Warning] In function `int:
> > 10 invalid conversion
> > 21 [Warning] initialization
> > 21 [Warning] argument
> > 50 invalid conversion
>
> Hvis du kompilerer det som et C++ program skal du caste retur
> værdien fra malloc og realloc:
>
> unsigned long int *parray =
> (unsigned long int *)malloc (max * sizeof parray[0]);
>
>
> unsigned long int *res =
> (unsigned long int *)realloc (parray, max * sizeof parray[0]);
>
> /b

Ja, det resulterede i at 2 af problemerne blev løst, mange tak for
det, men tilbage står der stadig de to [warning]´s i linie 21.

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


Dato : 05-04-04 00:50

Felix Nielsen wrote:
>
> Ja, det resulterede i at 2 af problemerne blev løst, mange tak for
> det, men tilbage står der stadig de to [warning]´s i linie 21.

Det er "kun" warnings, programmet burde kompilere.
Du kan fjerne dem ved at tilføje et par cast:

const unsigned long max_divisor = (unsigned long )sqrt((double )UINT_MAX);

/b

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


Dato : 04-04-04 22:05

Felix Nielsen wrote:
>>Her er min udgave af et C-program som finder primtal ved hjælp af din
>>algoritme.
>
> Jeg er meget glad for det besvær du har gjort dig, men det virker altså ikke.

Jo, det gør, men det er et C-program som jeg skrev. Forsøg ikke at
oversætte det med en C++-oversætter.

Du skrev i starten af tråden at du forsøgte i skrive i C. Hvis du
hellere vil programmere i C++, bør programmet se meget anderledes ud. I
så fald vil man ikke bruge malloc/realloc/free, men std::vector til at
gemme de fundne primtal i. Måske andre vil give et eksempel på det.


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


Dato : 04-04-04 22:40

Byrial Jensen wrote:

> Du skrev i starten af tråden at du forsøgte i skrive i C. Hvis du
> hellere vil programmere i C++, bør programmet se meget anderledes ud. I
> så fald vil man ikke bruge malloc/realloc/free, men std::vector til at
> gemme de fundne primtal i. Måske andre vil give et eksempel på det.
>

Jeg lavede et eksempel med std::vector d. 1/4

/b

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


Dato : 05-04-04 04:14

Byrial Jensen <bjensen@nospam.dk> wrote in message news:<40707886.70505@nospam.dk>...
> Felix Nielsen wrote:
> >>Her er min udgave af et C-program som finder primtal ved hjælp af din
> >>algoritme.
> >
> > Jeg er meget glad for det besvær du har gjort dig, men det virker altså ikke.
>
> Jo, det gør, men det er et C-program som jeg skrev. Forsøg ikke at
> oversætte det med en C++-oversætter.
>
> Du skrev i starten af tråden at du forsøgte i skrive i C. Hvis du
> hellere vil programmere i C++, bør programmet se meget anderledes ud. I
> så fald vil man ikke bruge malloc/realloc/free, men std::vector til at
> gemme de fundne primtal i. Måske andre vil give et eksempel på det.

Ja, du har naturligvis ret, det er bare mig der ikke ved hvad jeg
taler om. Det er nu lykkedes mig at få det til at virke, selvom der
var et par linier den havde problemer med, men det var noget jeg
sagtens selv kunne klare...

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

Månedens bedste
Årets bedste
Sidste års bedste