prime
changeset 0 1f4d150b3e3b
child 2 22e93ecd595f
equal deleted inserted replaced
-1:000000000000 0:1f4d150b3e3b
       
     1 #!/usr/bin/perl
       
     2 # Natalie Schlittermann BB11 Set 1
       
     3 # Primzahlzerlegung
       
     4 # Eine Zahl die in sämtlichen Primzahlen zerlegt wird
       
     5 
       
     6 use strict;
       
     7 use warnings;
       
     8 use File::Basename;
       
     9 #use Smart::Comments;
       
    10 #use diagnostics;
       
    11 
       
    12 my $ME = basename $0;
       
    13 
       
    14 #n: ist die Zahl aus der die sämtlichen Primzahlen gefiltert wird
       
    15 #i: Primzahl: diese wird durch n geteilt
       
    16 
       
    17 my $number = $ARGV[0];
       
    18 
       
    19 if (not @ARGV) {
       
    20     # FIXME: be more verbose
       
    21     die "$ME: Sorry, need the number\n";
       
    22 }
       
    23 
       
    24 #1. find all divisors of $number
       
    25 my @divisors = findDivisors($number);
       
    26 
       
    27 #2. delete all non primes
       
    28 
       
    29 my @primes = ();
       
    30 
       
    31 #for each element in array divisors
       
    32 foreach my $div (@divisors) { #same element in div
       
    33 
       
    34     #find all divisors of div and save in subprimes
       
    35     my @subprimes = findDivisors($div);
       
    36 
       
    37     #determine length of subprimes and save in noOfDivisors
       
    38     my $noOfDivisors = scalar(@subprimes);
       
    39 
       
    40     #
       
    41     if ($noOfDivisors == 0) {@primes = (@primes, $div); }
       
    42 }
       
    43 
       
    44 #print"Die Teile von $number sind: ".join(", ", @divisors)."\n";
       
    45 #print"Die Primzahlteile von $number sind: ".join(", ", @primes)."\n";
       
    46 
       
    47 my @xxx = xxx($number, @primes);
       
    48 
       
    49 if (@xxx) {
       
    50     print join("*", @xxx), "\n"; 
       
    51 }
       
    52 else {
       
    53     #print STDERR "Sorry, $number is prime itself!\n";
       
    54     warn "Sorry, $number is prime itself\n!";
       
    55 }
       
    56     
       
    57 exit;
       
    58 
       
    59 #### SUBROUTINES #####
       
    60 
       
    61 sub findDivisors {
       
    62     my $i = 2;
       
    63     my $m = $_[0];
       
    64     
       
    65     my @divisors = ();
       
    66     
       
    67     while ($i < $m) {
       
    68 	if($m % $i ==0){
       
    69 	    @divisors = (@divisors, $i);
       
    70 	}
       
    71 	$i++;
       
    72     }
       
    73     return @divisors;
       
    74 }
       
    75 
       
    76 sub xxx {
       
    77     my $current = shift @_;
       
    78     my @primes = @_;
       
    79 
       
    80     my @result;
       
    81     foreach my $prime (@primes) {
       
    82 	while (0 == ($current % $prime)) {
       
    83 	    push @result, $prime;
       
    84 	    $current = $current / $prime;
       
    85 	    # better:
       
    86 	    # $current /= $prime;
       
    87 	}
       
    88     }
       
    89 
       
    90     return @result;
       
    91 }