【发布时间】:2016-10-13 06:46:34
【问题描述】:
给定一个数组 A,我必须将数组的所有元素相乘。由于数字可以达到 10^9 ,因此我必须找到产品的尾随零。我做了以下事情:
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 替换了 2 来计算 5 的数量。
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[].
我该如何改进它?或者有没有其他不同的方法可以更快地计算它。请帮帮我。
【问题讨论】:
-
这对我来说似乎是最有效的方法。转变比分裂快,但我看不到在这里利用它的方法。我个人认为你已经做到了,我期待看到其他人怎么说。好问题!
-
FWIW,如果你真的关心效率,stackoverflow.com/questions/12356442/binary-divisibility-by-10;也可以在这里看到:stackoverflow.com/questions/7070346/… BTW,这个缩进和你在实际代码中使用的一样吗?
-
@vaxquis 这个方法不会很长吧?将 long long 转换为二进制,然后进行那些位操作,然后计算零。 ?我不好,但似乎很漫长。
-
代码有严重问题。首先,如果您的任何 a[i] 为 0,您的代码将进入无限循环。其次,乘以这么多整数保证溢出。我想说在寻求建议之前,你应该努力提高问题的资格。
-
std::div 将同时进行取模和除法
标签: c++ arrays count multiplication zero