2、零
【问题描述】
零是个好数字啊。万物都是从0开始的,譬如说c语言的数组下标,你在世界上存在的天数啊等等等等,然后一个数xor它自己结果也是等于0的。根据惯例,我们的第一句话一定与题目无关的。
其实题目还是很简单,求出给出的若干个数的乘积末尾有多少个0。
。
【输入文件】
输入文件zero.in。第一行包含一个整数n,代表乘数的个数。接下来n行分别是n个正整数,行首行尾行中均不会有空格出现,出现找我算账。
【输出文件】
输出文件zero.out应包含一个正整数,为乘积末尾0的个数。
【样例输入】
3
357
96
35
【样例输出】
1
【数据规模】
对于20%的数据,乘积在int64范围内。
对于60%的数据,乘积不超过1000位。
对于100%的数据n≤1000,每个数的长度不大于1000,答案小于1000。
比较水的一道题,但是考试的时候急了,没有想清楚。等交卷前十分钟才发现有更优方法。
我用的乘法,最后数零。其实用不着。
最优方法是统计所有因数中2的总数和5的总数,然后取一个最小值。用高精除单精就行了。
//#include <iostream>
//using std::cout;
//using std::cin;
#include <cstdio>
const long oo = 0x7fff0000;
char num[1005][1005];
char ans[1005];
long size[1005];
long sa = 1;
long n = 0;
long div(long p,long q)
{
sa = size[p];
long yushu = 0;
for (long i=size[p];i>0;i--)
{
ans[i] = (yushu*10+num[p][i])/q;
yushu = (yushu*10+num[p][i])%q;
}
if (ans[sa]==0) sa--;
return yushu;
}
void swap(long l,long p,long q)
{
long tmp = num[l][p];
num[l][p] = num[l][q];
num[l][q] = tmp;
}
void dao(long l)
{
size[l] = 0;
while (num[l][++size[l]]!=0){num[l][size[l]]-='0';}
size[l]--;
for (long i=1;i<=(size[l]>>1);i++)
{
swap(l,i,size[l]-i+1);
}
}
int main()
{
freopen("zero.in","r",stdin);
freopen("zero.out","w",stdout);
scanf("%ld",&n);
for (long i=1;i<n+1;i++)
{
scanf("%s",num[i]+1);
}
for (long i=1;i<n+1;i++)
{
dao(i);
}
long count2 = 0;
long count5 = 0;
for (long i=1;i<n+1;i++)
{
while (div(i,2)==0)
{
count2++;
for (long j=1;j<sa+1;j++)
{
num[i][j] = ans[j];
size[i] = sa;
}
}
while (div(i,5)==0)
{
count5++;
for (long j=1;j<sa+1;j++)
{
num[i][j] = ans[j];
size[i] = sa;
}
}
}
printf("%ld",count2<?count5);
return 0;
}