使用BigInteger大容量運算類計算100的階乘
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),怒江州企業(yè)網(wǎng)站建設(shè),怒江州品牌網(wǎng)站建設(shè),網(wǎng)站定制,怒江州網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,怒江州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
一.一般算法(循環(huán))
view plaincopy to clipboardprint?
public class Test {
public static void main(String[] args) {
int result = 1;
for (int i = 1; i = 100; i++) {
result *= i;
}
System.out.println(result);
}
}
public class Test {
public static void main(String[] args) {
int result = 1;
for (int i = 1; i = 100; i++) {
result *= i;
}
System.out.println(result);
}
}
輸出結(jié)果為0,因為int無法保存下100的階乘的結(jié)果,100的階乘的長度至少大于50位,也要大于long,double
二.使用BigInteger大容量運算類
view plaincopy to clipboardprint?
import java.math.BigInteger;
public class Test {
public static void main(String[] args) {
BigInteger result = new BigInteger("1");//為result賦初始值,為1
for (int i = 1; i = 100; i++) {
BigInteger num = new BigInteger(String.valueOf(i));
result = result.multiply(num);//調(diào)用自乘方法
}
System.out.println(result);//輸出結(jié)果
System.out.println(String.valueOf(result).length());//輸出長度
}
}
import java.math.BigInteger;
public class Test {
public static void main(String[] args) {
BigInteger result = new BigInteger("1");//為result賦初始值,為1
for (int i = 1; i = 100; i++) {
BigInteger num = new BigInteger(String.valueOf(i));
result = result.multiply(num);//調(diào)用自乘方法
}
System.out.println(result);//輸出結(jié)果
System.out.println(String.valueOf(result).length());//輸出長度
}
}
計算結(jié)果為:93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
產(chǎn)度:158
1、采用自頂向上的遞歸方法,代碼如下:
import?java.util.Scanner;
public?class?Test?{
@SuppressWarnings("resource")
public?static?void?main(String[]?args)?{
//?從控制臺輸入一個整數(shù)
Scanner?in?=?new?Scanner(System.in);
int?b?=?in.nextInt();
//?聲明一個Test對象,調(diào)用cal方法獲得結(jié)果
Test?test?=?new?Test();
long?a?=?test.cal(b);
System.out.println(a);
}
//?通過遞歸掉調(diào)用最終返回結(jié)果
public?long?cal(int?number)?{
//?如果數(shù)字為1,則直接返回
if?(number?==?1)?{
return?1;
}?else?{//?否則遞歸求值
return?number?*?cal(number?-?1);
}
}
}
2、遞歸方法:
遞歸算法是把問題轉(zhuǎn)化為規(guī)??s小了的同類問題的子問題。然后遞歸調(diào)用函數(shù)(或過程)來表示問題的解。一個過程(或函數(shù))直接或間接調(diào)用自己本身,這種過程(或函數(shù))叫遞歸過程(或函數(shù)).
3、特點:
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結(jié)束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設(shè)計程序。
(4) 在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數(shù)過多容易造成棧溢出等。所以一般不提倡用遞歸算法設(shè)計程序。
親測可用
long jiecheng(int x)
{
long int i,k=1;
for(i=1;i=x;i++)
k=k*i;
return k;
}
int main()
{
long int j,k=0;
int i;
for(i=1;i=20;i++)
{
j=jiecheng(i);
k+=j;
}
printf("%ld\n",k);
}
輸出的結(jié)果是2561327494111820313
擴展資料:
一個正整數(shù)的階乘(factorial)是所有小于及等于該數(shù)的正整數(shù)的積,并且0的階乘為1。自然數(shù)n的階乘寫作n!。1808年,基斯頓·卡曼引進這個表示法。
亦即n!=1×2×3×...×n。階乘亦可以遞歸方式定義:0!=1,n!=(n-1)!×n。
計算方法:
大于等于1:
任何大于等于1 的自然數(shù)n 階乘表示方法:n! =?1×2×3×...×(n-1)n或n! = n×(n-1)!
0的階乘:0!=1。
參考資料:百度百科——階乘
代碼如下
import java.util.Scanner;
public class Calculate {
public static void main(String[] args) {
// TODO Auto-generated method stub
long sum=1;
System.out.println("請輸入要計算階乘的正整數(shù):");
Scanner sc=new Scanner(System.in);
int b=sc.nextInt();
for (int i=1; i=b; i++) {
sum *=i;
}
System.out.println("該數(shù)的階乘為:"+sum);
}
}
class test{ public static void main(String[] args){ fun f=new fun(); for(int i=0;i=5;i++) System.out.print(f.fact1(i)+" "); System.out.println(); for(int i=0;i=5;i++) System.out.print(f.fact2(i)+" "); System.out.println(); long [] p=f.fact3(5); for(int i=0;ip.length;i++) System.out.print(p[i]+" "); System.out.println(); } } class fun{ long fact1(int n){ long result=1; if(n==0)return 0; for(int i=1;i=n;i++) result=result*i; return result; } long fact2(int n){ if(n==0)return 0; if(n==1)return 1; else return n*fact2(n-1); } long [] fact3(int n){ long [] result=new long[n+1]; result[0]=0; result[1]=1; for(int i=2;i=n;i++) result[i]=result[i-1]*i; return result; } }