【零】解题报告

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值