2016-10-12 2 views
1

배열 A가 주어지면 배열의 모든 요소를 ​​곱해야합니다. 숫자가 10^9까지 올라갈 수 있기 때문에 제품의 0을 찾아야합니다. 나는 다음을했다 :C++ : 배열 곱셈의 후행

int ans= 0; // to count no of trailing zeroes 
for(long int i =0; i<n ; i++) // n can be very large(upto 10^5) 
{ 
    long long int p=1; 
    p=p*a[i]; 
    while (p2℅10 ==0) 
    { ans++; 
    p=p/10; 
    } 
} 

2의 수를 계산하는 기능은 다음과 같다. 5의 nunber를 계산하기 위해 5를 2로 대체했습니다.

Int nm2(long long a) 
{ 
    Int b=0; 
    while(a℅2==0){ 
    a=a/2; 
    b++; 
    } 
    return b; 
    } 

Int p2=0,p5=0; 
For(long long i=L;i<R;i++) 
{ 
    p2 += nm2(a[i]); 
    p5 += nm5 (a[i]); 
    } 
Int ans += min(p2,p5); // storing no of zeroes every time I multiply elements of array from Index L to Index R of array a[]. 

어떻게 향상시킬 수 있습니까? 아니면 더 빠른 효율성으로 계산하는 다른 방법이 있습니다. 제발 도와주세요.

+0

이것은 나에게 가장 효율적인 방법과 같습니다. 이동은 나누기보다 빠르지 만, 여기에서 그 이동 방법을 보지 못합니다. 나는 네가 개인적으로 그걸 못 박았다고 생각한다. 나는 다른 사람들이 말하는 것을보기를 고대한다. 좋은 질문! – allen1

+1

FWIW, 효율성에 정말로 관심이 있다면 http://stackoverflow.com/questions/12356442/binary-divisibility-by-10; 또한 여기를 참조하십시오 : http://stackoverflow.com/questions/7070346/c-best-way-to-get-integer-division-and-remainder BTW, 그 들여 쓰기는 실제 코드에서 사용하는 것과 동일합니까? – vaxquis

+0

@vaxquis이 방법은 길지 않을까요? long long을 이진수로 변환 한 다음 해당 비트 조작을 수행 한 다음 0을 계산합니다. ? 나는 좋지 않지만 길어진 것처럼 보인다. –

답변

2

이것은 나누기의 세부 사항보다 번호 이론에 관한 것입니다. 여기에 내가

int fives = 0; 
int twos = 0; 

for (int i=0; i<n; i++) { 
    fives += countFives(a[i]); 
    twos += countTwos(a[i]); 
} 

int trailingZeros = fives > twos ? twos : fives; 

에게 countTwoscountFives이 매우 간단하고있는 두 가지 기능을 할 것이고, 주어진 입력 값의 각각 2, 5, 요인의 수를 계산 할 것입니다.

후행 0 수를 계산하는 줄은 각 후행 0이 정확히 2의 한 요소와 5의 한 요소로 인해야한다는 사실에 기반합니다. 5보다 2가 더 많으면 추가로 기여하지 않습니다 0으로, 그 반대의 경우도 마찬가지입니다. 따라서 후행 0의 수는 두 수 중 작은 수와 같습니다.

+0

나는 이것을 처음부터 정확하게했다. 그러나 긴 숫자에 대해서는 대답이 잘못되었다. 배열에서이 마지막 곱하기 전에하지만 업데이트 2와 5의 번호를 업데이트 할 때마다 배열에서 이루어집니다. 그래서 나는 나누기를해야만했는데이 시간 제한을 초과했습니다. –

+0

내게 예제를 줄 수 있습니까? 알고리즘이 잘못된 결과를 제공합니다. 정확하다고 확신합니다. 오만하길 원하지만 각각의 후미 0은 10 = 2 * 5의 계수로 인해야만합니다. 따라서 후행 0의 수는 5 개의 요소와 "일치하는"2 개의 수의 수와 같습니다. –

+0

2와 5의 계수를 계산하는 알고리즘을 게시 할 수 있습니까? 그래서 내가하고있는 것을 볼 수 있습니까? –

0

정말 큰 숫자를 처리 할 때 과학 표기법이 무엇입니까?

왜 후미 0이 필요한지 알 수 없지만 std :: scientific는 정말 큰 숫자 표현에 도움이 될 수 있습니다.

+0

아니요, 후행 0의 숫자가 필요합니다. –

+0

숫자를 문자열로 변환하고 숫자를 끝에서부터 계산합니다. 결과를 파일로 인쇄하십시오. 그런 다음 파일에 저장할 때 카운트하십시오. – user6590212

+0

대답은 18 자리 이상의 자릿수를 가지므로 매번이 큰 대답을 저장하고 여러 번 이렇게하는 것이 매우 바쁘고 느릴 것입니다. 그래서 2와 5의 숫자를 사용하려고합니다. –