藍橋杯:VIP試題 算法訓練 多階乘計算

藍橋杯:VIP試題 算法訓練 多階乘計算

資源限制
時間限制:1.0s 內存限制:256.0MB

問題描述
  我們知道,階乘n!表示n*(n-1)(n-2)21, 類似的,可以定義多階乘計算,例如:5!!=531,依次可以有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

#include<iostream>
#include<string>
using namespace std;
long long sum = 0;
long long  cal_sum(int n,int i){//計算每個階乘的值 
	
	long long tt_sum = 1;
	for(int j = n;j > 0;j -= i){
		tt_sum*=j;	
	}
	return tt_sum;
}
int main(){
	
	int n,k,m,t_sum = 0;
	cin>>n>>k;
	cin>>m;
	
	for(int i = 1; i <= k;i++){
		sum += cal_sum(n,i);//計算n(1)!+n(2)!+......+n(k)!的值
	}
	
	if(m == 1) cout<<sum;//,當m=1時,輸出n(1)!+n(2)!+......+n(k)!的值
	else{//m=2時計算並輸出n(1)!+n(2)!+......+n(k)!的"各個位"上的數字之和。
		while(1){
			if(sum == 0) break; 
			t_sum += sum %10;
			sum /= 10;
		}
		cout<<t_sum;		
	}
	
	
	return 0;
} 

在這裏插入圖片描述

說明:

  1. 要讀懂題目的意思:
    n(k)!:每間隔相差k值得階乘
    m=1時:直接輸出所有階乘之和
    m=2時:輸出所有階乘之和的每一位數之和,eg:輸出所有階乘之和爲123456,那麼就要輸出1+2+3+4+5+6的值

  2. 數據要用long long型,階乘的規模是很龐大的,開始由於作者的不嚴謹所以得了70分

  3. 本題可以不用函數,直接嵌套循環也可以實現同樣的目標(表達方式不同)

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