蓝桥杯练习系统 算法训练: ALGO-231 多阶乘计算

问题描述

  我们知道,阶乘n!表示n*(n-1)*(n-2)*......*2*1, 类似的,可以定义多阶乘计算,例如:5!!=5*3*1,依次可以有n!...!(k个‘!’,可以简单表示为n(k)!)=n*(n-k)*(n-2k)*....(直到最后一个数<=0)。
  现给定一组数据n、k、m,当m=1时,计算并输出n(1)!+n(2)!+......+n(k)!的值,m=2时计算并输出n(1)!+n(2)!+......+n(k)!的各个位上的数字之和。

输入格式

  两行,第一行为n和k,第二行为m。

输出格式

  一行,为n(1)!+n(2)!+......+n(k)!的值或n(1)!+n(2)!+......+n(k)!的各个位上的数字之和。

样例输入

5 1
2

样例输出

3

数据规模和约定

  0 < k < n <= 20

解题思路:思路很简单,但是要注意数据范围,因为n最大为20( 20! = 2.4329020081766e+18)long long的数据范围为:最大值:9223372036854775807(19位)       最小值:-9223372036854775808,所以应该使用long long。

#include<iostream>
using namespace std;

long long fun(int n,int k){
	long long s = 0;
	for(int i=1;i<=k;i++){
		long long sum = 1;
		for(int m=n;m>=1;m -= i){
			//cout<<m<<endl;
			sum *= m;	
		}
		//cout<<sum<<endl;
		s += sum;
	}

	return s;	
}

int main(){
	int n,k,m,num_sum = 0;
	long long num;
	cin>>n>>k;
	cin>>m;
	if(m == 1){
		cout<<fun(n,k);
	}else{
		num = fun(n,k);
		while(num){
			num_sum += num%10;
			num /= 10;
		}
		cout<<num_sum;
	}
	
	return 0;
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章