java中1+1d/5和1+1/5的區別說明

java 1+1d/5和1+1/5的區別

主要區別就是數據類型不同

1+1d/5的結果是1.2, 是double類型. 因為1d就是double類型,1d/5結果自動提升成double類型,1+1d/5結果也自動提升成double類型. .

1+1/5的結果1, 是int類型, 因為1/5是整除(會丟失小數部分的精度…) . 兩邊操作數都是int類型. 最後在加上1還是int類型.所以結果就是int類型.

java參考代碼如下

public class Test {
public static void main(String[] args) {
    double num1 = 1 + 1d / 5;
    System.out.println(num1);//輸出1.2
    int num2    = 1 + 1 / 5;
    System.out.println(num2);//輸出1
 }
}

計算1+1/2!+1/3!+…+1/20!之和

原題:計算1+1/2!+1/3!+…+1/20!之和

觀察題目,本題難點就是要計算階乘,不妨用一個循環來計算階乘,再用一個循環來計算從1/1!到1/20!的和。代碼如下

package java1;
public class sum {
   public static void main(String args[]) {
	   //用s來表示階乘結果
	   int s=1;
	   double sum=0;
	  //計算1/1!到1/20!的和
	   for(int i=1;i<=20;i++) {
		   //分別計算j從1到20的階乘
		   for(int j=1;j<=i;j++) {
			   s=s*j;
		   }
		   sum+=1.0/s;
	   }
	   System.out.println(sum);
   }
}

這個輸出結果為無窮,我當時想半天也沒結果,後來同學指出我每次算每個數的階乘時並沒有將重置為1;所以正確代碼如下

package java1;
public class sum {
   public static void main(String args[]) {
	   //用s來表示階乘結果
	   double sum=0;
	  //計算1/1!到1/20!的和
	   for(int i=1;i<=20;i++) {
		   //每次算完階乘後,計算下一次階乘時都要將s重置為1
		   int s=1;
		   //分別計算j從1到20的階乘
		   for(int j=1;j<=i;j++) {
			   s=s*j;
		   }
		   sum+=1.0/s;
	   }
	   System.out.println(sum);
   }
}

正確結果如下

在這裡插入圖片描述

可以觀察到上面代碼的時間復雜度為o(n^2),我們其實可以思考一下如何運用優化階乘,我這裡聽老師說階乘可以運用遞歸思想。代碼如下

package java1;
public class sum {
	//運用遞歸用來計算從1到20分別的階乘結果
	public static int JieChen(int i) {
		   if(i==1) {
			   return 1;
		   }
		   else {
			   return (JieChen(i-1)*i);
		   }
	}
   public static void main(String args[]) {
	   double sum=0;
	  //計算1/1!到1/20!的和
	   for(int i=1;i<=20;i++) {
		   int s;
		   //用來計算i的階乘
		   s=JieChen(i);
		   sum+=1.0/s;
	   }
	   System.out.println(sum);
   }
}

運用上面思路不僅可以計算有限的階乘分之一的和,而且我們還可以拓展到計算無限個

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: