由于阶乘的结果会超出java数据类型的最大范围,所以采用数组或集合作为存储结果的方式;集合具有长度的自动伸缩,故采用集合作为最终的存储方式;
算法如下:
各位相乘,满十进一位;
package com.datastruct.array;
import java.util.ArrayList;
import java.util.List;
/**
* 求n!
* @author ikon
*
*/
public class Factorial {
public static void main(String[] args){
List<Integer> datas = new ArrayList<Integer>();
datas.add(1);
System.out.print("输入要计算的阶乘的数字 : ");
ConsoleReader console = new ConsoleReader(System.in);
int n = console.readInt();
for(int i=1;i<=n;i++){
for(int j=0;j<datas.size();j++){
datas.set(j, datas.get(j)*i);
}
for(int j=0;j<datas.size();j++){
if(datas.get(j)>9){
if(datas.size()==j+1){
datas.add(j+1,0); //这里要注意进位,调用add
}
datas.set(j+1, datas.get(j+1)+datas.get(j)/10);
datas.set(j, datas.get(j)%10);
}
}
}
System.out.print(n+"!=");
for(int index=datas.size()-1;index>-1;index--){
System.out.print(datas.get(index));
}
}
}
ConsoleReader是个接收终端输入的工具类,如下:
package com.datastruct.array;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
public class ConsoleReader
{
public ConsoleReader(InputStream inStream)
{
reader = new BufferedReader (new InputStreamReader(inStream));
}
public int readInt()
{
String inputString = readLine();
int n = Integer.parseInt(inputString);
return n;
}
public double readDouble()
{
String inputString = readLine();
double x = Double.parseDouble(inputString);
return x;
}
public String readLine()
{
String inputLine = "";
try
{
inputLine = reader.readLine();
}
catch(IOException e)
{
System.out.println(e);
System.exit(1);
}
return inputLine;
}
private BufferedReader reader;
}