2016-12-13 10 views
0

프로그래밍 문제로 인해 30,000 개의 6 각형 숫자 (수식으로 표시됨 : H (n) = n (2n-1))를 확인해야합니다. 다음과 같이 나는 코드가 12숫자가 여러 다른 사람들에 의해 균등하게 나눠 졌는지 확인

까지의 숫자 1로 나눌 수 있습니다 :

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

지금 나는 바로 지금이 수표를 알고 내 문은 매우 비효율적이기 때문에이 있다면 궁금 된 경우 번호를 확인하는 더 쉬운 방법? for 루프를 사용해 보았지만 작동시키지 못했습니다 (한 번에 한 번만 확인). 어떤 아이디어?

+1

힌트! 숫자 (12)에 의해 균등하게 분할하면 다음도 2,도 3,도 4 및도 6 – tkausl

+0

으로 균등 분할 __must__는 (16 진수 % 2 '에 의해 육각 %'2 == 0'를 대체 할)'등 – VolAnd

+1

'hex % 1 == 0' ??? 정말? '0 == 0'과 같은 것입니까? – VolAnd

답변

8

1 <= i <= n에 대한 a[i] | x,이 경우를 들어 lcm(a[1], ..., a[n]) | x

, 그냥, lcm(1,2,...,12) | h 경우 확인해야 즉 h % 27720 == 0


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

나는 조금 혼란스러워. 어떻게 27720 번호를 얻었습니까? 1에서 12까지 숫자로 나눌 수 있다고 가정합니다. – Gardenia

+0

@ Gardenia 27720은 1,2의 임대 배수입니다 ... 12 – delta

+0

오, 이해해 주셔서 감사합니다. – Gardenia

1

당신은 단순히 또 다른 사용할 수 있습니다 긴 if 문을 제거하는 루프 당신이 사용한 것.

#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

을 계산하는 ONY 방법이다 것과 다른 방법 질문이 게시 되었습니까? 여기서 불필요한 반복 작업을하고 있습니다. 예를 들어, 3과 4와 12로 나눗셈을 확인하는 경우, 3과 4로 나누면 자동으로 12로 나눕니다. 따라서 1에서 12까지의 LCM을 계산하고 다음으로 나눗셈을 확인하십시오. 그. – instance

+0

@instance no offense. 나는 당신의 의견에 동의합니다. 이는 긴 if 문을 사용하는 대신 대상을 달성하기위한 대안 일뿐입니다. –

+0

하지만 여전히 당신의 코드는 틀렸어. OP는 1에서 12까지의 모든 숫자로 나눌 수있는 숫자의 개수를 찾고 싶다. 당신이하는 일은 각 "16 진수"에 대해 "i"로 나누면 "count" . 모두 1에서 12로 나눌 수있는 경우에만 카운트를 1 씩 증가시켜야합니다. – instance