藍橋杯: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;
}
說明:
-
要讀懂題目的意思:
n(k)!:每間隔相差k值得階乘
m=1時:直接輸出所有階乘之和
m=2時:輸出所有階乘之和的每一位數之和,eg:輸出所有階乘之和爲123456,那麼就要輸出1+2+3+4+5+6的值 -
數據要用long long型,階乘的規模是很龐大的,開始由於作者的不嚴謹所以得了70分
-
本題可以不用函數,直接嵌套循環也可以實現同樣的目標(表達方式不同)