Programeer opdrachtenOpdracht : opdr7a_pascal.txt

Terug naar de inzendingen
Opdracht 7a,Pascal Schiks
17 Dec 2009
 Mijn inzending in perl
 Ik durf niet te beweren dat het een top oplossing is en echt inovatief is hij
 ook niet,
 maar voor zover ik weet voldoet hij verder aan alle eisen
 
 1 
*****WortelTrekken.pl*****
  
 2iperl -wT
 3# Title    : WortelTrekken.pl
 4# Function : Lees een getal en bepaal daarvan de wortel
 5# Author   : Pascal Schiks (C) 2009/2010 GNU-GPL
 6
 7# Mijn bijdrage aan de programeer opdracht van Dec 2009
 8
 9use strict;
 10
 11my $huidige_priemgetal=1;
 12
 13# kijk of een getal deelbaar is door een willekeurig ander getal
 14my $is_deelbaar = sub
 15{
 16  my ($boven, $onder)=@_;
 17  return 0 if($boven==2); # beetje flauwe oplossing maar geen zin in betere
 18  my $deelbaar=0;
 19  do
 20  {
 21    $deelbaar++ if(($boven / $onder) == int($boven / $onder));
 22    $onder++;
 23  }
 24  while(!$deelbaar&&($onder < $boven));
 25  return $deelbaar;
 26};
 27
 28# Priemgetallen berekenen.
 29my $geef_niew_priemgetal = sub
 30{
 31  do
 32  {
 33     $huidige_priemgetal++;
 34  }
 35  while($is_deelbaar->($huidige_priemgetal, 2));
 36 
 37  return $huidige_priemgetal;
 38};
 39
 40# invoer
 41print "Geef getal>";
 42my $getal=<>;
 43chomp($getal);
 44
 45print "De wortel uit $getal is ";
 46
 47# Wortel trekken
 48my @wortels;
 49my $priemgetal = $geef_niew_priemgetal->();
 50while($getal > 1)
 51{
 52   if(($getal/$priemgetal) == int($getal/$priemgetal))
 53   {
 54      push(@wortels, $priemgetal);
 55      $getal/=$priemgetal;
 56   }
 57   else
 58   {
 59      $priemgetal = $geef_niew_priemgetal->();
 60   }
 61
 62# Beetje flauwe oplossing om later de index niet uit de array te laten lopen
 63push(@wortels, 0);   
 64
 65# Gelijke wortels samenvoegen
 66my $natuurlijke_getallen=1;
 67my $priem_getallen=1;
 68my $ptr=0;
 69do
 70{
 71   if($wortels[$ptr] == $wortels[$ptr+1])
 72   {
 73      # Wortel 3 * Wortel 3 => 3
 74      $natuurlijke_getallen*=$wortels[$ptr];
 75      $ptr+=2;
 76   }
 77   else
 78   {
 79      $priem_getallen*=$wortels[$ptr];
 80      $ptr++;
 81   }
 82}
 83while($ptr < $#wortels);
 84
 85# Uitvoer
 86print " $natuurlijke_getallen " if($natuurlijke_getallen>1);
 87print " Wortel $priem_getallen " if($priem_getallen>1);
 88print "\n";
 89pop(@wortels); # Nulletje weghalen
 90print "De volgende wortelvormen werden gevonden @wortels\n";
 
 
Mijn commentaar
 
 Zoals ik al aangaf, er kan wel e.e.a. aan verbeterd worden.
 Zo ben ik vergeten te zorgen dat priemgetallen niet elke keer vanaf 2
 gecontroleerd worden in plaats vanaf het vorige priemgetal.
 ook verdiend mijn oplossing voor het getal twee geen schoonheidsprijs.