蓝桥杯 P0505 C++算法训练 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:256.0MB
  一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=12345=120,因此5!最右边的那个非0的数字是2。再如,7!=5040,因此7!最右边的那个非0的数字是4。再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。
输入:
  7
输出:
  4

解题思路:
该题千万要注意,不要盲目的乘,结果肯定会溢出,最好的解决方法是每次乘的结果丢弃掉不想要的值,而保留不影响最后非零的数的值,怎么做到呢?首先,可以把每次乘出来的结果的0去掉,但是要注意不能全部去掉,其次要注意保留的数如果太少,比如只有个位的数保留下来,那么当遇到2*5的情况,结果是0,那么算出来的非零数肯定会出错,保留到十位数是保险的形式。代码如下:

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n;
	cin >> n;
	int res = 1;
	for (int i = 1; i <= n; i ++){
		res *= i;
		while(res %  100 == 0){
			res /= 100;
		}
		res = res % 100;
	}
		while(res %  10 == 0){
			res /= 10;
		}
		res = res % 10;
		cout << res;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/106487517