一.阶乘是个很有意思的函数,大体的解法有这些:
package com.threetop.www;
//求解阶乘的方法
public class Jiechen {
//方法一:递归的解法
public static int fac(int n)
{
int sum;
if(n==0||n==1)
{
return 1;
}
sum=fac(n-1)*n;
return sum;
}
//方法二:非递归的解法(递推解法)
public static int fac2(int n)
{
int sum=1;
if(n==0||n==1)
{
return 1;
}
for(int i=2;i<=n;i++)
{
sum*=i;
}
return sum;
}
//类似二分法(高斯累加法)的解法
public static int fac3(int n)
{
int begain=1,sum=1;
if(n==0||n==1)
{
return 1;
}
while(true)
{
if(begain==n) //如果到达同一个数,只做一个数的乘积
{
sum*=n;
}
else
{
sum*=(begain*n); //双向两边做乘积操作
}
if((n-begain)==1||(n-begain)==0) //终止条件要么两个数相邻,要么相等
{
return sum;
}
begain++; //两个数向中间靠拢
n--;
}
}
public static void main(String []args)
{
System.out.println(fac(10));
System.out.println(fac2(10));
System.out.println(fac3(10));
}
}
运行结果如下:
二. 问题1:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。
问题2:求N!的二进制表示中最低位1的位置
具体的实现如下:
import java.util.Scanner;
public class Test
{
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
System.out.print("请输入需要求阶乘的数字:");
int N = in.nextInt();
int n = N;
int sumTen = 0;
int sumTwo = 0;
for(int i=1; i<=n; i++)
{
int k = i;
while(k%5 == 0)//整数i中可以被5整除的个数
{
sumTen = sumTen + 1;
k = k/5;
}
int j = i;
while(j%2 == 0)//整数i中可以被2整除的个数
{
sumTwo = sumTwo + 1;
j = j/2;
}
}
System.out.println(N+"!的末尾有:"+sumTen+"个零");
System.out.println(N+"!的二进制表示中最低位1的位置:"+sumTwo);
}
}
运行结果如下: