Avatar billede acid-head Nybegynder
20. april 2004 - 16:19 Der er 8 kommentarer og
1 løsning

Primtal og COMAL80

Jeg fandt i en matematikbog et lille program skrevet i COMAL80 til at finde alle primtal mellem to givne grænser. Det ser således ud:

//Programmet finder primtal mellem to givne grænser
INPUT "Angiv nedre grænse ": min
INPUT "Angiv øvre grønse ": max
PRINT "Primtallene mellem ";min;" OG ";max;" er: "
PRINT
antal:= 2
IF min MOD 2=0 THEN min:= min+1
FOR a:= min TO max STEP 2 DO
  FOR k:= 3 TO SQR(a) STEP 2 DO
    IF a MOD k=0 THEN GOTO ud
  NEXT k
  antal := antal+1
  PRINT a;
ud:
NEXT a
PRINT
PRINT "Ialt ";antal;" primtal"

Jeg kan ikke helt tyde det, men har lavet det om til følgende C++ kode:

#include <iostream.h>

int main()
{
    int antal=2;

    int min=0,max=0;
    cout << "Primtal mellem min og max" << endl;
    cout << "\n  min:" << endl << "  max:" << endl;
    gotoxy(8,3);
    cin >> min;
    gotoxy(8,4);
    cin >> max;

    if (min%2==0)
    {
      min=min+1;
    }

    for(int a=min;a<max;)
    {
        for(int k=3;k<sqrt(a);)
        {
            if (a%k==0)
            {
                a=a+2;
            }
            k=k+2;
        }
        antal = antal+1;
        cout << a << ' ';
    a=a+2;
    }

    cout << endl << "Fundet i alt: " << antal;

    return 0;
}

Problemet er bare at min C++ kode finder flere primtal i et givent interval end det er. I matematikbogen står der at der mellem 0 og 50000 findes 5134 primtal. C++ koden finder 9066..

Hvad er fejlen i koden..?
Avatar billede arne_v Ekspert
20. april 2004 - 16:37 #1
Umiddelbart ville jeg oversætte koden til:

#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    int min,max;
    cout << "Angiv nedre grænse: ";
    cin >> min;
    cout << "Angiv øvre grænse: ";
    cin >> max;

    int antal=2;

    if (min%2==0)
    {
      min++;
    }

    for(int a=min; a<=max; a=a+2)
    {
        for(int k=3; k<=sqrt(double(a)); k=k+2)
        {
            if (a%k==0)
            {
              goto skip;
            }
        }
        antal++;
skip:
        ;
    }

    cout << "Ialt " << antal << " primtal" << endl;

    return 0;
}
Avatar billede arne_v Ekspert
20. april 2004 - 16:40 #2
Men:
  - bogen siger at der er 5134 primtal 0-50000
  - programmet siger 5135
  - der er 5133 i virkeligheden
Avatar billede arne_v Ekspert
20. april 2004 - 16:42 #3
Hvis du retter antal=2 til antal=0 så skulle det give det rigtige resultat
Avatar billede arne_v Ekspert
20. april 2004 - 16:43 #4
svar
Avatar billede acid-head Nybegynder
20. april 2004 - 16:50 #5
Hvordan får jeg din version til at udskrive primtallene..?

Og kan man ikke undgå den der goto..?
Avatar billede arne_v Ekspert
20. april 2004 - 16:53 #6
#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    int min,max;
    cout << "Angiv nedre grænse: ";
    cin >> min;
    cout << "Angiv øvre grænse: ";
    cin >> max;

    int antal=2;

    if (min%2==0)
    {
      min++;
    }

    for(int a=min; a<=max; a=a+2)
    {
        for(int k=3; k<=sqrt(double(a)); k=k+2)
        {
            if (a%k==0)
            {
              goto skip;
            }
        }
        antal++;
        cout << a << endl; // <----
skip:
        ;
    }

    cout << "Ialt " << antal << " primtal" << endl;

    return 0;
}
Avatar billede arne_v Ekspert
20. april 2004 - 16:54 #7
Man kan sagtens lave en løsning uden goto.

Man kan bare sætte et flag.
Avatar billede arne_v Ekspert
20. april 2004 - 16:56 #8
#include <cmath>
#include <iostream>

using namespace std;

int main()
{
    int min,max;
    cout << "Angiv nedre grænse: ";
    cin >> min;
    cout << "Angiv øvre grænse: ";
    cin >> max;

    int antal=2;

    if (min%2==0)
    {
      min++;
    }

    for(int a=min; a<=max; a=a+2)
    {
        bool prim = true;
        for(int k=3; k<=sqrt(double(a)); k=k+2)
        {
            if (a%k==0)
            {
              prim = false;
              break;
            }
        }
        if(prim)
        {
          antal++;
        }
    }

    cout << "Ialt " << antal << " primtal" << endl;

    return 0;
}
Avatar billede acid-head Nybegynder
20. april 2004 - 16:58 #9
Dejligt.. Det var den løsning jeg ledte efter.. :)

Tak for det..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester