求关于n的阶乘结果后面有几个零?如2016的阶乘(网易的笔试选择题)
2017-03-25 16:50
567 查看
文章的原地址:http://blog.csdn.net/zyh2525246/article/details/53697136
一、阶乘数小的时候可以直接计算。
例如:求10!后面零的个数。很明显结果为3628800。 0的个数为2个。
20!结果为2432902008176640000,0的个数为4个。而这个时候已经达到19位数了。
更大的数,如果再直接去求。显然太麻烦了。
二、背后的规律
介绍一种求某个数阶乘结果后面零的个数的方法。
首先,出现零的情况就是 5 的倍数乘以偶数。
但是出现0的个数就不一定了,2*5=10 出现一个0。4*25=100会出现2个0。8*125=1000出现3个0.依次类推。
大家不难发现规律所在。4*25可以分解成2*5*2*5,8*125可以分解为2*5*2*5*2*5........
至于10,15,20 这些数 。 分解开,只会出现一个5,也就只会出现1个0。
至于50,75这些25的倍数,分解开,也只会出现2个5,与偶数相乘也只会出现2个0.
下面就是计算0的个数了。
上面也谈到了,偶数乘以5会出现一个0,乘以5的平方会出现2个0,乘以5的立方会出现3个0.
那么怎么计算阶乘里存在多少个5的倍数,25的倍数,125的倍数呢。而且,有个问题还需要注意,25,125也是5的倍数,125也是25的倍数。
例如 求100!后面0的个数。
由上所说的方法,是5的倍数的数有16(除去25的倍数),是25的倍数的数有4个,结果应该为16*1+4*2=24个0.
我们也可以换一种思维,出现一个5就是一个0,那么出现一个25就是2个0,如果5的倍数不排除25的倍数的话,每出现一个25的倍数,只加上1个0即可。
换句话说就是,0的个数就等于5的倍数的个数加上25的倍数的个数,即 20+4。
如果是求2016!后面0的个数呢?
同样按照上面的方法。
5的倍数个数为:
2016/5 = 403个
25的倍数个数为:
403/5 = 80个
125的倍数的个数为:80/5
= 16个
625的倍数的个数为: 16/5 = 3个。
所以可以得出2016!后面0的个数为:403+80+16+3 = 502个.
如何用代码又该如何实现呢?
很简单,用一个简单的循环就能解决,当然递归算法更好。这里我们就只贴循环的代码了。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入阶乘数:");
int a = scanner.nextInt();
int
count = 0;
for (; ;) {
a = a/5;
if (a == 0) {
break;
}else {
count+= a;
}
}
System.out.println("阶乘结果后面的零的个数为:"+count);
结果如下:
请输入阶乘数:2016
阶乘结果后面的零的个数为:502
当然,重在思想,代码没有什么好说的。希望大家也学到了这个方法。虽然在在生活中用处不大,但是转换思想的方法还是挺管用的。
一、阶乘数小的时候可以直接计算。
例如:求10!后面零的个数。很明显结果为3628800。 0的个数为2个。
20!结果为2432902008176640000,0的个数为4个。而这个时候已经达到19位数了。
更大的数,如果再直接去求。显然太麻烦了。
二、背后的规律
介绍一种求某个数阶乘结果后面零的个数的方法。
首先,出现零的情况就是 5 的倍数乘以偶数。
但是出现0的个数就不一定了,2*5=10 出现一个0。4*25=100会出现2个0。8*125=1000出现3个0.依次类推。
大家不难发现规律所在。4*25可以分解成2*5*2*5,8*125可以分解为2*5*2*5*2*5........
至于10,15,20 这些数 。 分解开,只会出现一个5,也就只会出现1个0。
至于50,75这些25的倍数,分解开,也只会出现2个5,与偶数相乘也只会出现2个0.
下面就是计算0的个数了。
上面也谈到了,偶数乘以5会出现一个0,乘以5的平方会出现2个0,乘以5的立方会出现3个0.
那么怎么计算阶乘里存在多少个5的倍数,25的倍数,125的倍数呢。而且,有个问题还需要注意,25,125也是5的倍数,125也是25的倍数。
例如 求100!后面0的个数。
由上所说的方法,是5的倍数的数有16(除去25的倍数),是25的倍数的数有4个,结果应该为16*1+4*2=24个0.
我们也可以换一种思维,出现一个5就是一个0,那么出现一个25就是2个0,如果5的倍数不排除25的倍数的话,每出现一个25的倍数,只加上1个0即可。
换句话说就是,0的个数就等于5的倍数的个数加上25的倍数的个数,即 20+4。
如果是求2016!后面0的个数呢?
同样按照上面的方法。
5的倍数个数为:
2016/5 = 403个
25的倍数个数为:
403/5 = 80个
125的倍数的个数为:80/5
= 16个
625的倍数的个数为: 16/5 = 3个。
所以可以得出2016!后面0的个数为:403+80+16+3 = 502个.
如何用代码又该如何实现呢?
很简单,用一个简单的循环就能解决,当然递归算法更好。这里我们就只贴循环的代码了。
Scanner scanner = new Scanner(System.in);
System.out.print("请输入阶乘数:");
int a = scanner.nextInt();
int
count = 0;
for (; ;) {
a = a/5;
if (a == 0) {
break;
}else {
count+= a;
}
}
System.out.println("阶乘结果后面的零的个数为:"+count);
结果如下:
请输入阶乘数:2016
阶乘结果后面的零的个数为:502
当然,重在思想,代码没有什么好说的。希望大家也学到了这个方法。虽然在在生活中用处不大,但是转换思想的方法还是挺管用的。
相关文章推荐
- 网易游戏2016实习生招聘笔试题目--井字棋
- 网易2016研发工程师笔试题 (整理)
- 阶乘结果后面零的个数
- 网易游戏2016校园招聘“游戏研发&平台开发”在线笔试——B题 Best Compression Algorithms
- 网易2016校招内推笔试编程题
- 网易游戏2016实习生招聘在线笔试:A 推箱子
- 网易2016实习研发笔试
- 下面关于ICMP协议的描述中,正确的是()----腾讯2016研发工程师笔试题
- 网易2016研发project师笔试题
- 2016网易春招Java在线笔试回忆录
- (整理)Java实现链表--找到两个链表的第一个公共结点(网易笔试题2016)
- 网易2015年Java开发笔试第三题 选择题
- 2016网易春季校园招聘产品策划笔试
- #每日一题#网易2016实习研发工程师笔试题
- 2016网易内推笔试编程题-3
- 下面关于HTTP协议的说法正确的是:----腾讯2016研发工程师笔试题(一)
- 网易2016校园招聘笔试题 最后一题压轴题(较难dp)
- 网易游戏2016实习生招聘在线笔试——题目1 : 推箱子
- 网易游戏2016校园招聘“游戏研发&平台开发”在线笔试——A题 Amusing Digits
- 2016网易产品笔试(无答案)