Autor Beitrag
ridderle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Sa 31.05.08 16:58 
Guten Tag,
ich möchte eine Funktion schreiben, die mir die Teilerpaare ausgibt:
Zur Definition: Zwei ganze Zahlen bilden ein Teilerpaar, wenn die Summe der Teiler der beiden Zahlen gleich ist.

Also zum Beispiel:
(12,26)
summe der Teiler von 12: 1+2+3+4+6=16
summe der Teiler von 26: 1+2+13=16

Nun habe ich ein Programm geschrieben, dass mir überprüft, ob 2 Zahlen ein Teilerpaar sind. Siehe unten:

Aber mit folgener Anweisung habe ich Probleme:

Zitat:
Verwenden Sie die Funktion, um ein Programm zu schreiben, das unter den 1000 ersten natürlichen Zahlen alle Teilerpaare ausgibt.

Wie soll diese Aufgabe zu interpretieren sein?

ausblenden volle Höhe C#-Quelltext
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:
        static bool teiler_paar(int a, int b)
        {   
            int teiler_zahl1 = 0;
            int teiler_zahl2 = 0;
            int summe_teiler = 0;
            bool ergebnis = false;
            
                for(int divisor_a = 1; divisor_a < a; ++divisor_a)
                {
                // Bestimmung der Teiler von a:
                    if (a % divisor_a == 0)
                    {
                        teiler_zahl1 = teiler_zahl1 + divisor_a;
                    }
                }

                for(int divisor_b = 1; divisor_b < b; ++divisor_b)
                {
                // Bestimmung der Teiler von b:
                    if (b % divisor_b == 0)
                    {
                        teiler_zahl2 = teiler_zahl2 + divisor_b;
                    }
                }

            Console.WriteLine("Die Summe der Teiler von a ist: " + teiler_zahl1);
            Console.WriteLine("Die Summe der Teiler von b ist: " + teiler_zahl2);
            
            if (teiler_zahl1 == teiler_zahl2)
                {
                    Console.WriteLine(a + " und " + b + " sind ein Teilerpaar");
                }
            return ergebnis;

       }
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 31.05.08 17:11 
Ich würde die Teilersummen aller Zahlen berechnen (dabei drauf achten, dass man bereits berechnete Ergebnisse wieder verwendet), in einer Tabelle "Zahl" <-> "Summe" ablegen und dann schauen, welche gleich sind. Letzteres würde ich so machen, dass ich die Tabelle nach der Summe sortiere.

//edit: In Chrome Oxygene könnte man das so machen und nutzt dank PFX sogar noch alle Prozessorkerne aus *g*
ausblenden Delphi-Prism-Quelltext
1:
from i in ParallelEnumerable.Range(1,1000select new class(zahl := i, summe := TeilerSumme(i)) into s order by s.summe;					

//edit2: In C# 3.0 sollte es auch so gehen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 01.06.08 11:54 
Bis 1000 würden es im Notfall wohl zwei verschachtelte Schleifen, die alle möglichen (a;b)-Paare bilden, auch tun :angel: . Kommt eben immer drauf an, wer der Korrektor ist :mrgreen: .
ridderle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Fr 06.06.08 19:22 
so,
habe es nun mit einer Schleife gelöst bzw. verschachtelten Schleifen.
Jetzt habe ich aber noch ein Problem:

wie bekomme ich es hin, dass es mir nur einmal ein Teilerpaar ausgibt: also zB:
Wenn jetzt die Zahl 12 und die Zahl 26 ein Teilerpaar ist, dass es mit dann nur ausgibt 12 und 26 sind ein Teilerpaar und nicht noch 26 und 12 sind ein teilerpaar.

Hier mal der Code:

ausblenden volle Höhe C#-Quelltext
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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
using System;
using System.Collections.Generic;
using System.Text;

namespace Hausaufgaben3
{
    class Program
    {
        static bool teiler_paar(int a, int b)
        {
            int zahl1 = 1;
            int zahl2 = 1;
            int teiler_zahl1 = 1;
            int teiler_zahl2 = 1;
            bool ergebnis = false;

            for (zahl1 = 1; zahl1 < 1000; ++zahl1)
            {
                int divisor_a = 1;
                teiler_zahl1 = 0;
                //Bestimmung der Teiler von Zahl1
                for (divisor_a = 1; divisor_a < zahl1; ++divisor_a)
                {
                    //Wenn Zahl1 keinen Rest hat, dann ist die entsprechende Zahl ein Teiler
                    if (zahl1 % divisor_a == 0 && zahl1 != divisor_a)
                    {
                        teiler_zahl1 = teiler_zahl1 + divisor_a;
                    }
                }
                // Gehe die Zahlen von 1-1000 durch
                for (zahl2 = 1; zahl2 < 1000; ++zahl2)
                {

                    //int divisor_b = 1;
                    teiler_zahl2 = 0;

                    //Bestimmung der Teiler von Zahl2
                    for (int divisor_b = 1; divisor_b < zahl2; ++divisor_b)
                    {

                        //Wenn Zahl2 keinen Rest hat, dann ist die entsprechende Zahl ein Teiler
                        if (zahl2 % divisor_b == 0 && zahl2 != divisor_b)
                        {
                            teiler_zahl2 = teiler_zahl2 + divisor_b;
                        }

                    }


                    if (teiler_zahl1 == teiler_zahl2 && teiler_zahl1 != 1 && teiler_zahl2 != 1 && zahl1 != zahl2)
                    {
                        Console.WriteLine("Ein Teilerpaar sind die Zahlen: " + zahl1 + " und " + zahl2);
                    }

                }

            }
            return ergebnis;

        }



        static void Main(string[] args)
        {

            Console.WriteLine("Teilerpaar");
            Console.WriteLine("Geben Sie die erste Zahl ein");
            int zahl1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Geben Sie die zweite Zahl ein");
            int zahl2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Das Ergebnis ist: ");

            teiler_paar(zahl1, zahl2);

            Console.WriteLine("Möchten Sie alle Teilepaare bis 1000 ausgeben?");
            Console.WriteLine("Ja [1]");
            Console.WriteLine("Nein [2]");
            Console.WriteLine("Alle Teilerpaare bis 1000: ");
            int auswahl = 0;

            Console.ReadKey();

        }
    }
}
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 06.06.08 19:31 
Folgende Überlegung:

zahl1 = 1
zu prüfende Zahlen: 2..1000

zahl1 = 2
zu prüfende Zahlen: 3..1000 (denn 2 ~ 1 schon geprüft)

...

zahl1 = 5
zu prüfende Zahlen: 6..1000 (denn 5 ~ 1, 5 ~ 2, 5 ~ 3, ... schon geprüft

zahl1 = 998
zu prüfende Zahlen: 999 und 1000 (alle anderen schon geprüft)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
ridderle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: So 08.06.08 12:03 
ok. überarbeitet:
stimmt es so?

ausblenden volle Höhe C#-Quelltext
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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
using System;
using System.Collections.Generic;
using System.Text;

namespace Hausaufgaben3
{
    class Program
    {
        static bool teiler_paar(int a, int b)
        {
            int zahl1 = 1;
            int zahl2 = 1;
            int teiler_zahl1 = 1;
            int teiler_zahl2 = 1;
            bool ergebnis = false;

            for (zahl1 = 1; zahl1 < 1000; ++zahl1)
            {
                int divisor_a = 1;
                teiler_zahl1 = 0;
                //Bestimmung der Teiler von Zahl1
                for (divisor_a = 1; divisor_a < zahl1; ++divisor_a)
                {
                    //Wenn Zahl1 keinen Rest hat, dann ist die entsprechende Zahl ein Teiler
                    if (zahl1 % divisor_a == 0 && zahl1 != divisor_a)
                    {
                        teiler_zahl1 = teiler_zahl1 + divisor_a;
                    }
                }
                // Gehe die Zahlen von 1-1000 durch
                for (zahl2 = zahl1+1; zahl2 < 1000; ++zahl2)
                {

                    //int divisor_b = 1;
                    teiler_zahl2 = 0;

                    //Bestimmung der Teiler von Zahl2
                    for (int divisor_b = 1; divisor_b < zahl2; ++divisor_b)
                    {

                        //Wenn Zahl2 keinen Rest hat, dann ist die entsprechende Zahl ein Teiler
                        if (zahl2 % divisor_b == 0 && zahl2 != divisor_b)
                        {
                            teiler_zahl2 = teiler_zahl2 + divisor_b;
                        }

                    }


                    if (teiler_zahl1 == teiler_zahl2 && teiler_zahl1 != 1 && teiler_zahl2 != 1 && zahl1 != zahl2)
                    {
                        Console.WriteLine("Ein Teilerpaar sind die Zahlen: " + zahl1 + " und " + zahl2);
                    }

                }

            }
            return ergebnis;

        }



        static void Main(string[] args)
        {

            Console.WriteLine("Teilerpaar");
            Console.WriteLine("Geben Sie die erste Zahl ein");
            int zahl1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Geben Sie die zweite Zahl ein");
            int zahl2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Das Ergebnis ist: ");

            teiler_paar(zahl1, zahl2);

            Console.WriteLine("Möchten Sie alle Teilepaare bis 1000 ausgeben?");
            Console.WriteLine("Ja [1]");
            Console.WriteLine("Nein [2]");
            Console.WriteLine("Alle Teilerpaare bis 1000: ");
            int auswahl = 0;

            Console.ReadKey();

        }
    }
}