无端计算循环
A Non-end computing loop
这个循环似乎没有尽头。
"sum < 4.7183" 似乎是可能的。
发出正确的 "k" 雾,"k" 是程序使其成为阶乘的分母的最小可能值,然后我们得到短语 1/k!以及它们与初始值 sum 的总和,sum = 4。
真的 为什么?
问题出在哪里?
//Maybe it's impossibe in short time!
import javax.swing.*;
import java.text.*;
public class ConditionalMinK_61 {
static double j;
static double f;
static double sum = 4;
static int k = 2;
static String sw;
public static void SymSymHa() {
DecimalFormat sa = new DecimalFormat("#.####");
while(sum < 4.7183) {
f=1;
for(j = 1; j <= k; j++)
f*=j;
sum+=(1/f);
++k;
switch(k%8001) {
case 0:
sw = "| |";
break;
case 1000:
sw = "|L |";
break;
case 2000:
sw = "|LO |";
break;
case 3000 :
sw = "|LOA |";
break;
case 4000:
sw = "|LOAD |";
break;
case 5000:
sw = "|LOADI |";
break;
case 6000:
sw = "|LOADIN |";
break;
case 7000:
sw = "|LOADING|";
}
System.out.println("Please Wait... S = "+sum+" "+sw+" k = "+k+" Impossible");
}
}
public static void Showit() {
DecimalFormat bs = new DecimalFormat("#.###");
JOptionPane.showMessageDialog(null, "minimum acceptable value of \"K\" is : " + k, "RESULT", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "The war isn't on portability or security... it's on ruining power.", "A Quotation", JOptionPane.INFORMATION_MESSAGE);
}
public static void main(String args[]){
SymSymHa();
Showit();
}
}
当k
达到171
时,f
的值变得很大,等于Double.POSITIVE_INFINITY
。因此 1/f
是 0.0
并且总和永远不会改变。 sum
增加直到达到 4.7182818284590455
然后停止增加,因此 while
循环是无限的。
试试这个
int k = 171;
double f = 1;
for(int j = 1; j <= k ; j++)
f*=j;
System.out.println(f);
System.out.println(1/f);
输出为
Infinity
0.0
即使 double
算术完美地模拟了实数,您的程序也将是一个无限循环,因为您似乎试图近似 e + 2
,即 4.7182818284590...
,所以它无论如何都不会达到 4.7183
。
这个循环似乎没有尽头。 "sum < 4.7183" 似乎是可能的。 发出正确的 "k" 雾,"k" 是程序使其成为阶乘的分母的最小可能值,然后我们得到短语 1/k!以及它们与初始值 sum 的总和,sum = 4。 真的 为什么? 问题出在哪里?
//Maybe it's impossibe in short time!
import javax.swing.*;
import java.text.*;
public class ConditionalMinK_61 {
static double j;
static double f;
static double sum = 4;
static int k = 2;
static String sw;
public static void SymSymHa() {
DecimalFormat sa = new DecimalFormat("#.####");
while(sum < 4.7183) {
f=1;
for(j = 1; j <= k; j++)
f*=j;
sum+=(1/f);
++k;
switch(k%8001) {
case 0:
sw = "| |";
break;
case 1000:
sw = "|L |";
break;
case 2000:
sw = "|LO |";
break;
case 3000 :
sw = "|LOA |";
break;
case 4000:
sw = "|LOAD |";
break;
case 5000:
sw = "|LOADI |";
break;
case 6000:
sw = "|LOADIN |";
break;
case 7000:
sw = "|LOADING|";
}
System.out.println("Please Wait... S = "+sum+" "+sw+" k = "+k+" Impossible");
}
}
public static void Showit() {
DecimalFormat bs = new DecimalFormat("#.###");
JOptionPane.showMessageDialog(null, "minimum acceptable value of \"K\" is : " + k, "RESULT", JOptionPane.INFORMATION_MESSAGE);
JOptionPane.showMessageDialog(null, "The war isn't on portability or security... it's on ruining power.", "A Quotation", JOptionPane.INFORMATION_MESSAGE);
}
public static void main(String args[]){
SymSymHa();
Showit();
}
}
当k
达到171
时,f
的值变得很大,等于Double.POSITIVE_INFINITY
。因此 1/f
是 0.0
并且总和永远不会改变。 sum
增加直到达到 4.7182818284590455
然后停止增加,因此 while
循环是无限的。
试试这个
int k = 171;
double f = 1;
for(int j = 1; j <= k ; j++)
f*=j;
System.out.println(f);
System.out.println(1/f);
输出为
Infinity
0.0
即使 double
算术完美地模拟了实数,您的程序也将是一个无限循环,因为您似乎试图近似 e + 2
,即 4.7182818284590...
,所以它无论如何都不会达到 4.7183
。