2016-05-09 13 views
0

Heute ist meine erste Frage auf Stack-Überlauf, danke alle für Antworten (Mein Englisch ist schlecht, sorry).Amicable Zahlen auf C#

Eigentlich arbeite ich im Programm mit ihm zeigen Sie mir freundliche Zahl der 0 von 10000. Programm wiederholen Zahlen verstehe ich nicht, warum nicht gut funktionieren.

Bild:

284 und 220 220 und 284 Wie wiederholen Zahlen löschen?

Beispiel Amicable Numbers:

Divisoren 220 sind 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 und 110: Die Summe beträgt 284 ., und die Summe der Divisoren von 284 (1, 2, 4, 71 und 142), ist gleich 220.

My-Code ist:

class Program 
{ 
    static int SumaDivisors(int nombre) 
    { 
     int suma; 
     suma = 0; 

     for (int contador = 1; contador < nombre; contador++) 
     { 
      if (nombre % contador == 0) 
      { 
       suma = suma + contador; 
      } 
     } 
     return suma; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Busca els nombres amics entre 0 i 10000"); 
     int numero, suma1, suma2; 

     for (numero = 1; numero < 10000; numero++) 
     { 

      suma1 = SumaDivisors(numero); 
      suma2 = SumaDivisors(suma1); 

      if (suma1 != numero && suma2 == numero) 
      { 
       Console.WriteLine("Els nombre {0} i {1} són nombres amics", suma1, suma2); 
      } 
     } 
      Console.ReadKey(); 
    } 
} 
+0

Ich kann nicht imgur während der Arbeit besuchen. Können Sie stattdessen die relevanten Informationen in die Frage kopieren? –

+2

Falls das einem anderen bekannt vorkommt, [das ist Problem # 21 auf Project Euler.] (Https://projecteuler.net/problem=21) –

Antwort

3

Dieser Fall betrachtet: numero = 220, dann suma1 = 284 und so suma2 = 220. Dann betrachten numero = 284, dann suma1 = 220 und so suma2 = 284, das genaue Gegenteil. Das Gleiche gilt für die anderen Paare.

Für die Lösung, die einfachste Überprüfung, die Sie tun können, ist nur zu drucken, wenn suma1 <= suma2.

+0

Danke für die Antwort, es ist wirklich eine einfache Lösung und es funktioniert richtig. – MarcCM

+0

Sie müssen die Paare in einer Liste speichern und anschließend die Duplikate aus der Liste entfernen (oder keine bereits vorhandenen Nummern hinzufügen). int [,] Daten = {{284, 220}, {220, 284}, {1210, 1184}, {1184, 1210}, {2924, 2620}, {2620, 2924}, {5564, 5020}, { 5020, 5564}, {6368, 6232}, {6232, 6368}}; – jdweng

+0

@MarcCM, sicher sein, diese Antwort zu akzeptieren, wenn es für Sie arbeitete – Clay

0

Sie wird während der Iteration zweimal gefunden. Um Wiederholungen zu vermeiden, können Sie entweder eine Liste hinzufügen, um das Paar zu verhindern, ein zweites Mal angezeigt wird:

static void Main(string[] args) 
{ 
    Console.WriteLine("Busca els nombres amics entre 0 i 10000"); 
    var list = new List<int>(); 
    int numero, suma1, suma2; 

    for (numero = 1; numero < 10000; numero++) 
    { 
     suma1 = SumaDivisors(numero); 
     suma2 = SumaDivisors(suma1); 

     if (suma1 != numero && suma2 == numero && !list.Contains(suma1) && !list.Contains(suma2)) 
     { 
      list.Add(suma1); 
      list.Add(suma2); 

      Console.WriteLine("Els nombre {0} i {1} són nombres amics", suma1, suma2); 
     } 
    } 

    Console.ReadKey(); 
} 
+0

Danke für die Antwort, großartige Option, aber ich verstehe diese Lösung nicht. Ich bin neu in C# Welt – MarcCM

0

wenn der linke Operand dieses if-Anweisung TRUE ist [zB (suma1 = numero!)]:

dann wird der zweite Operand nicht ausgewertet [z. B. (suma2 == numero)], so dass die Bedingung nicht abgefangen wird ... dies wird als Kurzschlussauswertung bezeichnet.

+0

Danke für Ihren Vorschlag, ich bin neu auf dieser Welt, ich schätze Ihre Lektion. – MarcCM