Avatar billede mikl-dk Nybegynder
02. september 2002 - 19:04 Der er 2 kommentarer og
1 løsning

Primtalsfaktorering

Hej Eksperter!

Jeg har lavet følgende script til at opløse et tal til primfaktorer. Det vil bare ikke som jeg vil. Jeg ved sku ikke lige, hvad der er galt. Jeg lavede det først i PHP (hvor det virker fint! Så ville jeg lave det om til C/C++, da det går hurtigere, men det stinker jeg til!


void main()
{
clrscr();
cout << "Velkommen til PrimFaktorsFind. Lavet af Mikkel Meyer Andersen d. 1/9-2002.\n" << endl;
getch();


clrscr();

int antal_primes         = 0;
int N              = 143;

int start_tal             = 0;
int slut_tal             = N;



int almindeligdivision_i;
float almindeligdivision_f;

int fejl;

int min_div;
int max_div;

int primes[20000];


    for (start_tal; start_tal <= slut_tal; start_tal ++)
    {
       
        almindeligdivision_i    = (start_tal / 2);
                almindeligdivision_f    = (start_tal / 2);

        if (almindeligdivision_i == almindeligdivision_f)
        {
            fejl = 1;
        }
   
        else
        {
            min_div    = 2;
            max_div    = (start_tal / 2) + 1;
       
            for (min_div; min_div < max_div; min_div ++)
            {

                                almindeligdivision_i    = (start_tal / min_div);
                                        almindeligdivision_f    = (start_tal / min_div);


                                if (almindeligdivision_i == almindeligdivision_f)
                    {
                    fejl = 1;
                    break;
                    }
            }
        }
       
        if (!fejl)
        {
        primes[antal_primes] = start_tal;
        antal_primes ++;
        }

        fejl    = NULL;
    }


//$N er blevet sat i toppen!
int N_kvad        = sqrt(N);

int p;
int p_max        = N_kvad;
int p_array[20000];
int p_array_no          = 0;

int q;
int q_min        = N_kvad;
int q_array[20000];
int q_array_no          = 0;




    for(int index = 0; index <= N; index++)
    {
        if (primes[index] <= p_max)
                {
                p_array[p_array_no]    = primes[index];
                p_array_no++;
                }

        if (primes[index] >= q_min)
                {
                q_array[q_array_no]    = primes[index];
                q_array_no++;
                }
    }


for (int p_i = 0; p_i <= p_array_no; p_i++)
{
    for (int q_i = 0; q_i <= q_array_no; q_i++)
    {
        int p_q = p_array[p_i] * q_array[q_i];

        if (p_q == N)
        {
        p = p_array[p_i];
        q = q_array[q_i];
        }
    }
}

if (!p || !q)
    cout << "Tallet er forkert!";

else
    {
    cout << "N = " << N << endl;
    cout << "p = " << p << endl;
    cout << "q = " << q << endl;
    }

getch();
}



/mikl.dk
Avatar billede cms Nybegynder
02. september 2002 - 19:53 #1
Hvordan så det ud i PHP?
Avatar billede mikl-dk Nybegynder
02. september 2002 - 20:03 #2
$antal_primes         = 0;
$N                    = $_POST["tal"];

$start_tal             = 0;
$slut_tal             = $N;


    for ($start_tal; $start_tal <= $slut_tal; $start_tal ++)
    {
       
        $almindeligdivision    = ($start_tal / 2);

        if (round($almindeligdivision) == $almindeligdivision)
        {
            $fejl = 1;
        }
   
        else
        {
            $min_div    = 2;
            $max_div    = round($start_tal / 2) + 1;
       
            for ($min_div; $min_div < $max_div; $min_div ++)
            {

                    $almindeligdivision    = ($start_tal / $min_div);

                    if (round($almindeligdivision) == $almindeligdivision)
                    {
                    $fejl = 1;
                    break;
                    }
            }
        }
       
        if (!$fejl)
        {
        $primes[]    = $start_tal;
        $antal_primes ++;
        }

        $fejl    = NULL;
    }


//$N er blevet sat i toppen!
$N_kvad        = sqrt($N);

$p;
$p_min        = 0;
$p_max        = round($N_kvad);

$q;
$q_min        = round($N_kvad);
$q_max        = $N;




    for($index = 0; $index <= $N; $index++)
    {
        if ($primes[$index] <= $p_max)
            $p_array[]    = $primes[$index];

        if ($primes[$index] >= $q_min)
            $q_array[]    = $primes[$index];
    }


for ($p_i = 0; $p_i <= count($p_array); $p_i++)
{
    for ($q_i = 0; $q_i <= count($q_array); $q_i++)
    {
        $p_q = $p_array[$p_i] * $q_array[$q_i];

        if ($p_q == $N)
        {
        $p = $p_array[$p_i];
        $q = $q_array[$q_i];
        }
    }
}

if ($p == "" || $q == "")
    echo "Tallet er forkert!";

else
    {
    echo "N = $N";
    echo "<br>";
    echo "p = $p";
    echo "<br>";
    echo "q = $q";
    }




Kan ses live på:
http://www.mikl.dk/prim/primtal.php
Avatar billede mikl-dk Nybegynder
02. september 2002 - 21:48 #3
Har fundet fejlen:
Jeg var kommet til at definerer start_tal som en int i stedet for en float...
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