问题描述
我们知道,阶乘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*N```K
import java.util.Scanner;
public class 多阶乘计算 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int m=sc.nextInt();
int sum=0;
for(int i=1;i<=k;i++){
sum += f(i,k);
}
System.out.println(sum);
int temp=sum;
int tempsum=0;
while(temp!=0){
tempsum+=temp%10;//个位数
temp/=10;
}
if(m==1)
System.out.println(sum);
else
System.out.println(tempsum);
}
public static int f(int n,int k){
int sum=1;
for(int i=0;i<n/k;i++){
sum*=(n-i*k);
}
return sum;
}
}
注意精度
import java.util.Scanner;
public class 多阶乘计算 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int m=sc.nextInt();
long sum=0;
for(int i=1;i<=k;i++){
sum+=f(n,i);
}
//System.out.println(sum);
long temp=sum;
long tempsum=0;
while(temp!=0){
tempsum+=temp%10;//个位数
temp/=10;
}
if(m==1)
System.out.println(sum);
else
System.out.println(tempsum);
}
public static long f(int n,int k){
long sum=1;
for(int i=0;i<n;i++){
if(n-i*k>0){
sum*=(n-i*k);
}
}
return sum;
}
}
另一种代码
import java.util.Scanner;
public class 多阶乘计算 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int m=sc.nextInt();
long s=n;
long sum=0;
while(k>0){
for(int i=1;i<=n;i++){
if(n-i*k>0){
s*=(n-i*k);
}
}
k--;
sum+=s;
s=n;
}
//System.out.println(sum);
long temp=sum;
long tempsum=0;
while(temp!=0){
tempsum+=temp%10;//个位数
temp/=10;
}
if(m==1)
System.out.println(sum);
else
System.out.println(tempsum);
}
}
这个是M=2时用的字母,这个也可以看看
import java.util.Scanner;
public class Factorial_1 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//【 多阶乘计算】
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int k=sc.nextInt();
int m=sc.nextInt();
sc.close();
fun(k,n,m);
}
public static long sum=0; //存储第二次总和
public static long c=0; //存储第一层总和
public static long b=0; //存储sum各位数之和
//方法
public static void fun(int k,int n,int m) {
sum=n;
while(k>0) {
//计算第二层总和
for(int i=1;i<=n;i++) {
if(n-i*k>0) {
sum *= (n-i*k); //计算第一层总和
}
}
k--; //控制第一层循环次数
c+=sum; //求和
sum=n; //重新赋值
}
//判断m
if(m==1) {
System.out.println(c);
}else if(m==2) {
//计算sum各位数之和
StringBuilder builder=new StringBuilder(c+"");
for(int j=0;j<builder.length();j++) {
b+=builder.charAt(j)-48;
}
System.out.println(b);
}
}
}
605

被折叠的 条评论
为什么被折叠?



