日期:2014-05-20  浏览次数:20700 次

一道程序题求解
本人刚入门,求解
写出过程代码
s=1-1/2+1/3-1/4+1/5-...
求当s> 0.1时的s的值 并打印出全过程

------解决方案--------------------
float s = 1.0;
System.out.print( "s= 1 ");
for(int i=1;;i++){
if(s < 0.1){
break();
}
if(i%2 == 1){
s = s - 1/(i+1);
System.out.print( "- 1/ "+(i+1));
}else{
s = s + 1/(i+1);
System.out.print( "+ 1/ "+(i+1));

}
}
------解决方案--------------------
public class Test {
public static void main(String args[]) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
double n =Double.parseDouble(s);
double sum=1;
for(int i=2;i <n;i++){
if(sum> 0.1){
if(i%2==0){
sum=sum-(1.0/i);
System.out.println( "sum: "+sum);
}else{
sum=sum+(1.0/i);
System.out.println( "sum: "+sum);
}
}
}
}
}

------解决方案--------------------
ls的做法有问题,是死循环了,因为这个数列不可能小于0.1的,而且 s = s - 1 / (i+1)时,这个值永远是1,因为i是int型的 1/(i+1) (i> 1)时永远是0,而且代码 if(i%2==1) 也不严谨,似应改为 if(i%2 != 0) 较为严谨些,可以避免负奇数的麻烦。
lz的问题也是有问题的,s> 0.1?那还算什么呀,还没算就大于了0.1,我想应该是计算精度误差大于0.1吧,代码如下:
public static void main(String[] args) {
  double epsilon = 0.1d; // 计算精度
  double sum = 1.0d;
  double preSum = 0d;
  double error = 1;
  StringBuilder sb = new StringBuilder( "s=1 ");
  for(int i = 1; error > epsilon; i++) {
    preSum = sum;
    if ((i & 1) != 0) {
      sum -= 1.0d / (i + 1);
      sb.append( "-1/ ");
    } else {
      sum += 1.0d / (i + 1);
      sb.append( "+1/ ");
    }
    sb.append(i + 1);
    error = Math.abs(sum - preSum);
    System.out.printf( "%s=%.16f (精度误差: %.5f)%n ", sb.toString(), sum, error);
  }
}