藍橋杯練習系統 算法訓練: 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;
	
}

 

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