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參考代碼如下
1
2
3
4
5
6
7
8
|
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!的和。代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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;所以正確代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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),我們其實可以思考一下如何運用優化階乘,我這里聽老師說階乘可以運用遞歸思想。代碼如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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); } } |
運用上面思路不僅可以計算有限的階乘分之一的和,而且我們還可以拓展到計算無限個
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_44955363/article/details/103063794