2016-08-07 2 views
0

나는 아래 도전을 시도하고있다. https://www.hackerrank.com/contests/projecteuler/challenges/euler145/submissions/code/25262675어떻게이 코드를보다 효율적으로 만들 수 있습니까? 자바 알고리즘

기본적으로 코드는 약 1에서 9 자리까지 다양한 길이의 숫자를 뒤집어서이 숫자를 더하고 결과가 홀수로 구성되어 있는지 확인합니다. 0은 허용되지 않습니다 (예 : 100 제외되어야 함).

세련된 코드는이 수치를 계산할 수 있지만 사이트에는 시간 초과가 있으며 성능이 좋지 않습니다.

정규식을 사용해 보았지만 제대로 정렬 할 수 없어 결과에 영향을 미쳤습니다. 이것을 최대한 빨리 실행하는 가장 좋은 방법은 가능한 한 빨리 정규 표현식이나 다른 것을 사용해야하는 경우라면 도움이 될 것입니다.

public static void main(String[] args) { 

    Scanner scan = new Scanner(System.in); 
    long t = scan.nextInt(); //Number of numbers to test 
    for (int i = 1; i <= t; i++){ 
     long n = scan.nextLong(); 
     calc(n); //begins calculation 
    } 
} 

public static void calc(long n) 
{ 
    long reversible = 0; //Counter 
    for (long i = 1; i < n; i++) 
    { 
     if (i%10 != 0) //Makes sure number does not end with a zero 
     { 
      long reverse = 0; 
      long j = i; 
      long checkOdd; 
      //Reverse the number 
      while(j != 0) 
      { 
       reverse = reverse * 10; 
       reverse = reverse + j%10; 
       j = j/10; // 
      } 
      long result = i + reverse; //Add current number and reverse 
      while (result != 0) 
      { 
       //Check and remove numbers to see if odd or not 
       checkOdd = result%10; 
       if (checkOdd%2 == 0){ //Even detected, move to next number 
        result = 0;       
       } 
       result = result/10; //Move to next digit 
       //Counts and ensures we do not count the same number multiple times 
       if (checkOdd%2 == 1 && result == 0) 
       { 
        reversible = reversible + 1; 
       } 
      } 

      /** REGEX TEST CODE -- fails when result is 5 digits long after testing */ 
      /** if(Pattern.matches("\\d[^02468]", Long.toString(result))) 
      { 
       System.out.println(result); 
       reversible = reversible + 1; 
      }*/ 


     } 
    } 
    System.out.println(reversible); 
} 
+2

(오일러를 사용하면 _brute force_가 자주 실패합니다.) – greybeard

+0

그래서 방정식을 계산하여 계산하려면 무엇을 제안합니까? –

+1

이 질문은 http://codereview.stackexchange.com/에 더 잘 맞는 것 같습니다. – jaco0646

답변

0

이렇게하면 문제가 완전히 해결되지는 않지만이 문제에 대해 생각해 볼 수 있도록 도움을 얻을 수 있습니다.

집합의 카디널리티를 계산하기 때문에 요소에 해당 집합이 있는지 확인하는 대신 해당 집합의 요소를 만드는 방법을 고려해야합니다.

시작하려면 특정 길이의 숫자를 만드는 방법을 생각해보십시오.

한 자리 숫자부터 시작하겠습니다. 우리는 이것을 a으로 표시 할 것입니다. a을 반대로 가져 가면 a이됩니다. 이 값이 두 배가되면 2a이됩니다. 항상 짝수이므로 항상 짝수 자릿수로 끝나며 따라서 아무 것도 없습니다.

다음은 1 자리 숫자입니다. ab으로 표시되며 ab은 자릿수입니다. 반비례는 ba이고, 가장 가까운 위치는 (나중에 참조 할 경우 0에서 시작하여 나중에 참조 할 것임) (a+b)%10입니다. 따라서이 중 마지막 숫자는 정확히 하나와 b가 홀수 일 경우에만 홀수입니다. 또한 a+b의 캐리는 1 또는 0이며이 값은 z입니다. 이것은 다음 부분에서 중요합니다. 게재 순위 1(a+b+z)%10입니다. a+b이 홀수이어야한다는 것을 이미 결정한 후,이 홀수를 유지하려면 z이 이제 0이어야합니다. 그래서 a+b < 10. 이제 당신은 b와 b의 조합이 필요합니다. 숫자의 끝에 있기 때문에 어느 것도 0이 될 수 없습니다.

a | b 
1 | 2,4,6,8 
2 | 1,3,5,7 
    ... 

물론, 우리는 이들을 계산할 수 있어야합니다. 따라서 a=1의 경우 b이 짝수이고 b<9이므로 4 가지 가능성이 있습니다. a=2의 경우 b은 홀수이고 b<8이므로 4 가지 옵션이 있습니다.

3 자리 숫자에 대해이 아이디어를 재현 할 수 있어야하며, 가능성을 계산할 때 절감액을 계산할 필요가 없으므로 그 중 하나를 생성하거나 확인하는 것이 더 분명해야합니다.

편집 :

a+c is odd 
a+c>=10 
b<=4 

조합 회의는 그 규칙이 작동합니다 : 세 자리 숫자 abc을 위해 거기에 도착하는 작업, 나는 결론에 도달 여담하지 않고있다. 이 경우 a,c20 조합이 표시되고 은 b에 대한 독립 값이므로 20 * 5 = 100은 3 자리 숫자로 표시됩니다. 희망을 갖고 내가 잘못했거나 시도 할 때 같은 결론에 도달했기를 바랍니다.

그 이상으로 확장하면 어떤 길이로 일반화 할 수있는 패턴이 있음을 알아야합니다 (중요 홀수와 길이가 얼마나 중요한지 중요한 차이점이있을 수 있습니다).

실제로 솔루션을 제공하는 것은 생산성이 떨어지며 (어쨌든 이미 어딘가에 있다고 확신합니다.) 바라건대 문제 해결 방법에 대한 인식을 전환시킬 수 있습니다.