Schrift
[thread]6591[/thread]

RDW #B - Raetsel der Woche Nummer B

Tags: Ähnliche Threads

Leser: 1


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
esskar
 2004-12-21 15:11
#50263 #50263
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
RDW #B - Raetsel der Woche Nummer B
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Regeln:  * Bitte nicht vor Ablauf der ersten 72 Stunden ( = drei Tage ) nach
~~~~~~~    Veroeffentlichung Hinweise (Spoiler) oder Loesungen veroeffent-
          lichen!

        * Wenn diese Zeit abgelaufen ist, werde ich einen Thread mit passen-
          dem Titel erstellen, in dem die Loesungen gepostet werden und dis-
          kutiert werden koennen.

        * Die Loesungen sollten nicht nur gepostet, sondern auch an mich ge-
          mailt werden, damit ich sie testen, "bewerten"  und zusammenfassen
          kann. Die Adrese dafuer lautet:

          esskar <---AT---> perl <---MINUS---> community <---DOT---> de

          Im Betreff sollte 'RDW' und die Nummer des Raetsels stehen. Hilf-
          reich waere neben dem Quellcode der Username im Forum sowie Perl-
          und OS-Version, falls Du diese kennst.

        * Verstaendnisfragen duerfen in diesem Thread gestellt werden, aber
          Tipps und (Teil-) Loesungen sind hier unerwuenscht.

        * Ich werde die eingeschickten Programme im Netz zur Verfuegung
          stellen, so dass gerade lange Quellcodes nicht (komplett)
          gepostet werden muessen.

        * Zur Verwendung von Modulen: Ich moechte diese nicht generell aus-
          schliessen, aber wenn quasi die komplette Aufgabe durch die Ver-
          wendung eines Moduls ersetzt werden kann, ist dies vielleicht nicht
          der Sinn der Aufgabe gewesen.



Aufgabe: Mit großen Zahlen rechnen
~~~~~~~~

        (Dieser Vorschlag stammt von mir, Fragen bitte an mich richten =)
       
        Schreibe ein Package Rdw::BigInt, das Lange Zahlen darstellen kann.
       
        Hier die Signatur des Packages:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
         
        package Rdw::BigInt;
       
        sub new # construktor; als optimalen parameter kann eine große Zahl als String oder ein Object vom Typ Rdw::BigIntübergeben werden
        {
           # ...
        }
       
        sub set # erhält als parameter $bigint eine große Zahl als String oder ein Object vom Typ Rdw::BigInt
        {
           my ($self, $bigint) = @_;
           # ...
        }
       
        sub add # addiert $bigintobj; $bigintobj ist vom Typ Rdw::BigInt
        {
           my ($self, $bigintobj) = @_;
           # ...
        }
       
        sub sub # subtraiert $bigintobj; $bigintobj ist vom Typ Rdw::BigInt
        {
           my ($self, $bigintobj) = @_;
           # ...
        }
       
        sub mul # multipliziert $bigintobj; $bigintobj ist vom Typ Rdw::BigInt
        {
           my ($self, $bigintobj) = @_;
           # ...
        }
       
        sub div # dividiert $bigintobj; $bigintobj ist vom Typ Rdw::BigInt
        {
           my ($self, $bigintobj) = @_;
           # ...
        }
       
        sub mod # modulo rechnung $bigintobj; $bigintobj ist vom Typ Rdw::BigInt
        {
           my ($self, $bigintobj) = @_;
           # ...
        }        
       
        sub get_data #  gibt einen String zurück, der die Zahl repräsentiert
        {
          my ($self) = @_;
        }
       
        1;

       
        Natürlich dürfen auch andere Funktionen vorhanden sein;
        Alle Funktion sollten im Erfolg Fall, $self zurück geben; ansonsten undef.
       
        Beispiel 1:
       
        my $bigint1 = Rdw::BigInt->new("10");
        my $bigint2 = $bigint1->add("5");
       
        print $bigint1->get_data(); # "15"
        print $bigint2->get_data(); # "15"
       
        $bigint->add($bigint2);
        print $bigint1->get_data(); # "30"
       
        Beispiel 2:
       
        my $bigint = Rdw::BigInt->new();
       
        $bigint->set("6541831546313468413216810316864");
        $bigint->add("65464540");
       
        print $bigint->get_data(); # "6541831546313468413216875781404"
       
        Beispiel 3:
       
        my $bigint = Rdw::BigInt->new();
       
        $bigint->add("100");
       
        print $bigint->get_data(); # "100"        
       
        Dieses Rätsel ist Vorläufer für das nächste Rätsel. :)
                 
        Viel Spass.  
\n\n

<!--EDIT|esskar|1103640220-->
dominicn
 2004-12-21 15:58
#50264 #50264
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
zwei fragen:

1. sehe ich das richtig (bzw. ist das so gewollt), dass das ergebnis auch immer dem ausgangsobjekt zugeordnet wird?

also:
Code: (dl )
1
2
3
4
my $bi = Rdw::BigInt->("10");
$bi->add("90");
$bi->mul("10");
print $bi->get_data(); # "1000"


2. wie soll die funktion div() arbeiten? nur ganzzahlige division (wie in tp - 8 div 3 = 2) oder sollen da auch ergebnisse rauskommen können, die nicht vom typ Rdw::BigInt sind??
Crian
 2004-12-21 16:10
#50265 #50265
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Dürfen wir auch die passenden Operatoren überladen?

Dürfen wir in den Code des echten Bigint's schielen? ;)

Edit: Hättest Du den Code oben nicht perldoc perlstyle-konform machen können? ;) Jetzt bin ich hier unnötig am Klammerverschieben, und viele andere bestmmt auch. *g

...repräsentiert....\n\n

<!--EDIT|Crian|1103638712-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2004-12-21 16:38
#50266 #50266
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=dominicn,21.12.2004, 14:58]1. sehe ich das richtig (bzw. ist das so gewollt), dass das ergebnis auch immer dem ausgangsobjekt zugeordnet wird?[/quote]
ja

[quote=dominicn,21.12.2004, 14:58]
wie soll die funktion div() arbeiten? nur ganzzahlige division (wie in tp - 8 div 3 = 2) oder sollen da auch ergebnisse rauskommen können, die nicht vom typ Rdw::BigInt sind??
[/quote]

ganzzahlig.
8 div 3 = 2
-8 div 3 = -2
8 div 0 = undef
esskar
 2004-12-21 16:42
#50267 #50267
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Crian,21.12.2004, 15:10]Dürfen wir auch die passenden Operatoren überladen?[/quote]
zusätlich ja;

wobei

Code: (dl )
$bigint + $binint2

nicht das selbe ist wie
Code: (dl )
$bigint1->add($bigint2);


sondern eher
Code: (dl )
$bigint += $binint2


[quote=Crian,21.12.2004, 15:10]
Dürfen wir in den Code des echten Bigint's schielen?
[/quote]

bringt dir persönlich nix; außerdem wenn jeder dies tun würde, wäre es langweilig

[quote=Crian,21.12.2004, 15:10]
Hättest Du den Code oben nicht perldoc perlstyle-konform machen können
[/quote]

ich hätte schon

[quote=Crian,21.12.2004, 15:10]...repräsentiert....[/quote]

fixed
Crian
 2004-12-21 17:05
#50268 #50268
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
[quote=esskar,21.12.2004, 15:42]wobei

Code: (dl )
$bigint + $binint2

nicht das selbe ist wie
Code: (dl )
$bigint1->add($bigint2);


sondern eher
Code: (dl )
$bigint += $binint2
[/quote]
hmmm in Pseudocode:

Code: (dl )
1
2
3
4
a = 10
b = 15
c = a + b
gib_aus a, b, c


Da würde ich erwarten, dass 10, 15, 25 ausgegeben wird.
Allerdings bei Deiner Interpretation müsste dann 25 15 25 ausgegeben werden, oder?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-12-21 17:20
#50269 #50269
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ergänzung: In Beispiel 1 muss es unten $bigint1 heißen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Crian
 2004-12-21 18:02
#50270 #50270
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
So, Deine drei Beispiele kann ich nachbilden, aber ich glaub ich soll die anderen Methoden auch mit Leben füllen, oder? =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2004-12-21 18:27
#50271 #50271
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Crian,21.12.2004, 17:02]So, Deine drei Beispiele kann ich nachbilden, aber ich glaub ich soll die anderen Methoden auch mit Leben füllen, oder? =)[/quote]
so ist es gewollt, ja!
Crian
 2004-12-21 19:42
#50272 #50272
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Ich habe es jetzt so implementiert, dass es eine Klasse für natürliche Zahlen ist. Reicht das fürs Anschlußrätsel aus, oder brauchts da ganze Zahlen? (Hoffentlich nicht ... so ist es eine schöne Klasse mit Array statt Hash...)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2004-12-21 15:11.