2016-12-13 7 views
0

Ich habe ein Programmierproblem, das mich auf die 30.000 Hexagonale Zahlen überprüfen soll (gegeben durch die Formel: H (n) = n (2n-1)), wie viele davon teilbar sind durch die Zahlen 1 bis 12Prüfen, ob eine Zahl gleichmäßig durch viele andere geteilt wird

I-Code haben wie folgt:

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int hex, count = 0; 

    for (int n = 1; n <= 30000; n++) 
    { 
     hex = n * ((2 * n) - 1); 

     if (hex % 1 == 0 && hex % 2 == 0 && hex % 3 == 0 && hex % 4 == 0 && hex % 5 == 0 && hex % 6 == 0 && hex % 7 == 0 && hex % 8 == 0 && hex % 9 == 0 && hex % 10 == 0 && hex % 11 == 0 && hex % 12 == 0) 
     { 
      count++; 
     } 
    } 

    cout << count << endl; 
} 

jetzt weiß ich den Scheck habe ich jetzt in meiner if-Anweisung sehr ineffizient ist, so dass ich frage mich, ob es eine einfachere Möglichkeit, die Nummer zu überprüfen? Ich habe versucht, eine for-Schleife zu verwenden, aber konnte es nicht zum Laufen bringen (da es nur 1 Zahl auf einmal prüft). Irgendwelche Ideen?

+1

Tipps: Wenn eine Anzahl gleichmäßig durch 12 teilt dann __must__ es auch gleichmäßig teilen, indem er 2, 3, 4 und 6 – tkausl

+0

Sie können auch 'hex% 2 == 0 'durch' (hex% ersetzen 2) 'usw. – VolAnd

+1

' hex% 1 == 0' ??? "Ja wirklich?" Ist es etwas wie 0 == 0? – VolAnd

Antwort

8

Wenn a[i] | x für 1 <= i <= n, dann lcm(a[1], ..., a[n]) | x

Für diesen Fall müssen nur wenn lcm(1,2,...,12) | h überprüfen, das heißt h % 27720 == 0


  1. https://en.wikipedia.org/wiki/Least_common_multiple
+0

Ich bin nur ein wenig verwirrt, wie hast du die Nummer 27720 bekommen? Ich nehme an, dass es durch die Zahlen 1 bis 12 teilbar ist? – Gardenia

+0

@Gardenia 27720 ist das Leasing gemeinsame multiple von 1,2, ... 12 – delta

+0

Oh, ich verstehe, gut danke! – Gardenia

1

können Sie einfach eine andere Verwendung für Schleife, um von der langen if-Anweisung loszukommen dass du benutzt hast.

#include <iostream> 
#include <cstring> 

using namespace std; 

int main(){ 
    int hex, count = 0; 
    int divider = 12; 

    for (int n = 1; n <= 30000; n++){ 
     hex = n * ((2 * n) - 1); 

     int subcount = 0; 
     for (int i = 1; i <= divider; ++i){ 
      if (hex % i == 0){ 
       ++subcount; 
       if(subcount == devider){ 
        ++count; 
       } 
      } 
     } 
    } 

    cout << count << endl; 
} 
+0

wie ist anders als was in Frage gestellt? Hier machen Sie unnötige Iterationen, zum Beispiel Sie überprüfen Division durch 3 und 4 und 12, wenn es durch 3 und 4 geteilt wird, wird es automatisch durch 12 geteilt. Berechnen Sie daher die LCM für 1 bis 12, Teilbarkeit mit prüfen Das. – instance

+0

@instanz nichts für ungut. Ich stimme deinem Kommentar zu. Dies ist nur eine Alternative zum Erreichen des Ziels, anstatt eine lange if-Anweisung zu verwenden. –

+0

aber immer noch ist Ihr Code falsch, OP möchte die Anzahl der Zahlen finden, die durch ALLE Zahlen von 1 bis 12 teilbar sind. Was Sie tun, ist, für jedes "hex" erhöhen Sie "count" wenn es durch "i" teilt . Sie müssen count nur um 1 inkrementieren, wenn es durch alle 1 bis 12 teilbar ist. – instance

Verwandte Themen