蓝桥杯 算法训练 多阶乘计算(c语言版详细注释)

试题 算法训练 多阶乘计算

                                                                                  蓝桥杯试题解答汇总链接

资源限制

       时间限制: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<stdio.h>
int main(){
	int n,k,m,i,j,sum1=0;
	long long t,sum=0;//注意数据类型t用来计算k个n(k)!,sum用来计算总和 
	scanf("%d%d",&n,&k);
	scanf("%d",&m);
	for(i=1;i<=k;i++){//每次循环计算n(i)!的值 
		t=1;//初始化t为1 
		for(j=n;j>0;j-=i){//此阶乘意思就是相差i的数的阶乘 
			t*=j;
		}
		sum+=t;
	}
	if(m==1){
		printf("%I64d",sum);
	}
	else{
		while(sum){//sum=0时结束循环 
			sum1+=sum%10;
			sum/=10;
		}
		printf("%d",sum1);
	}
	return 0;
} 
发布了51 篇原创文章 · 获赞 58 · 访问量 4630

猜你喜欢

转载自blog.csdn.net/xyf0209/article/details/104374742