|
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 } |