趣味百道之巧算末位

今天做了几道趣味百题,发现一些很有意思的算法,其实不如说是理解方式,理解题意并从另一个角度破题,成为这几题菜鸟玩家的首选

首先第六题,题目设计让求13^13,如果按照我开始的想法,用递归求结果再取余,就会出现负数的结果,后来找到了另一种边做乘边取余,因为每次计算只有后三位对题目要求有帮助,所以用循环求每次积的后三位,避免了前面的问题。

#include <stdio.h>

#define T 1
#define F 0

int fac(int n,int m)//递归失败
{
	if(n == 1)
	{
		return m;
	}
	return fac(n-1,m)*m;
}

int main()
{
	int x,y;
	int last = 1;
	int j;
	for(j = 0;j < 13;j++)
	{
		last = last*13%1000;
	}
	//unsigned int i = fac(13,13) % 1000;
    printf("后三位的结果是%d\n",last);

    return 0;
}

第七题是求100的阶乘结尾有几个0

#include <stdio.h>

int main()
{
	int i;
	int count = 0;
	for(i = 5;i <= 100;i += 5)
	{
		count++;
		if(0 == (i%25))
		{
			count++;
		}
	}
	printf("100的阶乘末尾0的数量为:%d\n",count);

    return 0;
}

一个数的末尾有几个0,取决于乘数因子的2和5数对

先来数5因子有几个:在100内,5作为因子的数有5, 10, 15, 20, 25... 总共有20个。但是注意到25, 50, 75, 100都包含了2个5作为因子(25=5*5, 50=2*5*5)
因此对于这些数,我们要多数一次。所以总共就是有24个5因子。
从公式角度: 5因子的数目 = 100/5 + 100/(5^2) + 100/(5^3) + ... = 24 (必须是整数)
现在再来数2因子有几个:2, 4, 6, 8, 10, ... 总共有100/2=50个2因子,100/4=25个4因子(要多计数一次),100/8=12个8因子(要多计数一次),...
所以  2因子的数目 = 100/2 + 100/(2^2) + 100/(2^3) + 100/(2^4) + 100/(2^5) + 100/(2^6) + 100/(2^7) + ... = 97
 
综上所述,共有24个5因子 和 97个2因子,所以能凑24 个 (2,5) 对。
因此100的阶乘也就有24个结尾零

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

使劲编

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值