2009-07-27 3 views
-5

저는 정수를 분리 요인으로 사용하고 싶습니다. 예를 들어, 레코드의 총 수는 경우 :Perl을 사용하여 정수를 어떻게 계수합니까?

169 - (13 x 13 times) 
146 - (73 x 2 times) 
150 - (50 x 3 times) 
175 - (25 x 7 times) 
168 - (84 x 2) 
160 - (80 x 2 times) 

더 이상 10,000있어 때 - 더 이상 100,000이되면 나는 1000 에 모든 것을 할 - 내가 원하는 이러한 방법으로 10,000

에 모든 것을 원하는 숫자를 인수로 삼으십시오. 이것을 달성하는 방법? 이러한 종류의 숫자 연산에 사용할 수있는 Perl 모듈이 있습니까?

총 레코드 수가 10k라고 가정합니다. 1000x10 배로 분할해야합니다. 100 또는 10 초가 아닙니다.

sqrt 기능을 사용할 수 있습니다. 하지만 항상 기대하는 것은 아닙니다. 내가 입력 146을 주면, 나는 (73, 2)를 얻어야한다.

+1

OP에는 철자/문법 오류가 많이 있습니다. –

+0

downvote 이유? – joe

+0

나는 무엇을 변경하고 수정했다. – joe

답변

5

Perl에서 다른 언어와 동일한 알고리즘을 사용할 수 있습니다. 아이디어에는 펄 스페셜 마술이 없습니다. 이것은 단지 구현 일 뿐이므로이 문제와 같은 것은 아마도 모든 언어 구현과 매우 유사하게 보일 것입니다.

어떤 문제를 해결하려고합니까? 우리가 무엇을하려고하는지 알면 올바른 알고리즘을 알려줄 수 있습니다 :

  • 왜 1,000을 넘는 숫자는 1000을 사용해야합니까? 대부분의 숫자는 1,000 요소가 없습니다.
  • 모든 요소를 ​​원하거나 가장 큰 요소 만 원합니까?
  • sqrt 함수가 예상대로 작동하지 않는다는 것은 무엇을 의미합니까? 일반적인 알고리즘을 따르는 경우에는 요인을 테스트하기 위해 제곱근의 바닥까지 반복해야합니다. 대부분의 정수에는 정수 제곱근이 없습니다.
2

숫자가 소수가 아닌 경우 인수 분해 알고리즘을 사용할 수 있습니다.

여기에 이러한 기능의 예입니다 : (9 ~ 15 말) 허용 범위에서 몇 가지 일반적인 숫자를 통해 http://www.classhelper.org/articles/perl-by-example-factoring-numbers/factoring-numbers-with-perl.shtml

+0

숫자가 소수라도 팩토리링 알고리즘을 사용할 수 있습니다. 당신은 다만 어떤 추가 요인도 얻지 않는다. :) –

+0

사실이긴하지만 그 결과는 1 x N이 될 것입니다. 원래 포스터에는 그렇게 유용하지 않다고 생각됩니다. :) –

1

루프, 테스트 번호를 모듈로 나머지를 계산하고, 가장 낮은를 선택합니다.

sub compute_width { 
    my ($total_records) = @_; 
    my %remainders; 
    for(my $width = 9; $width <= 15; $width += 1) { 
     my $remainder = $total_records % $width; 
     $remainders{$width} = $remainder; 
    } 
    my @widths = sort { 
     $remainders{$a} <=> $remainders{$b} || 
     $a <=> $b 
    } keys %remainders; 
    return $widths[0]; 
} 
관련 문제