Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:数组乘法中的尾随零_C++_Arrays_Count_Multiplication_Zero - Fatal编程技术网

C++ C++;:数组乘法中的尾随零

C++ C++;:数组乘法中的尾随零,c++,arrays,count,multiplication,zero,C++,Arrays,Count,Multiplication,Zero,给定一个数组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=

给定一个数组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;
    }
 }
int-ans=0;//计数尾随零的数目

对于(long int i=0;i这更多的是关于数论,而不是关于除法的细节

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; 
int-fives=0;
int-twos=0;
对于(int i=0;i twos?twos:5;
两个函数
countTwos
countFives
非常简单,分别计算给定输入值的2和5的因子数


计算尾随零数的行是基于这样一个事实,即每个尾随零必须是2的一个因子和5的一个因子。如果2多于5,则它们不会产生任何额外的零,反之亦然。因此尾随零数等于两个计数中的较小者。

不是吗在科学记数法是为当你处理真正的大数


不知道为什么需要尾随的零,但std::scientific可能会帮助您表达真正的大数。

对我来说,这似乎是最有效的方法。移位比除法快,但我看不到利用这一点的方法。我想你个人已经做到了,我期待着看到其他人说什么。问得好!FWIW,如果你真的关心效率,也看看这里:顺便说一句,缩进和你在实际代码中使用的缩进一样吗?@vaxquis这个方法不会很长吗?将一个很长的长度转换成二进制,然后进行那些位操作,然后计算零的数量。我不擅长,但这似乎是一种很长的方法。代码有严重的问题。首先所有,如果您的任何a[i]如果为0,代码将进入无限循环。其次,乘以这么多整数会导致溢出。我想说的是,在寻求建议之前,你应该努力提高问题的质量。std::div将立即进行模和除法。我一开始就这样做了。但是对于长的数字,答案是错误的。尽管有些在最后一次乘法之前,数组中的元素会被更新,但每次更新数组时,我都会更新2和5的数量。这就是为什么我必须进行除法,但由于除法超出了时间限制。你能给我一个例子,说明我的算法给出的结果不正确。我相信它是正确的。这不是自大,而是每个尾随零必须由一个因子10=2*5决定,因此尾随零的数量等于“匹配”的2个因子的数量一个5因子。你能发布计算2和5因子的算法吗?这样我就可以看到你在做什么了。@Samthonton你正确地计算了2。问题是你如何使用结果。请显示完整的代码。@user58697关于计算2(或5)因子是正确的。一定是其他问题。不,我只需要尾随零的数字。将数字转换为字符串并从末尾开始计数。或者将结果打印到文件中。然后在将其存储到文件中时对其进行计数。答案的位数将超过18位,因此每次存储这个大答案并执行多次计时这就是为什么我尝试使用2和5的数字。
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;