杭电 OJ-ACM 1012 (u Calculate e)

原题:

Problem Description

e的一个简单数学公式是08c68eb6611e4db98a65a283dacf6edc.gif

 

其中允许n为无穷大。这实际上可以使用相对较小的n值得出非常精确的e近似值。

Output

输出由上述公式生成的n值从0到9的e的近似值。输出的开头应与下面所示相似。

Sample Output

 n e
 - -----------
 0 1
 1 2
 2 2.5
 3 2.666666667
 4 2.708333333

(☆)注意:上述仅仅是部分输出,而题目要求是从0到9,审题应当准确!!!(在此竟然耽误了近二十分钟)

    具体分析——首先,由于该代码不要求键盘输入,故不需要加入Scanner类进行输入,即不需要写import java.util.Scanner;其次,第一行和第二行只需要机械地输出即可,没有逻辑可言,运用"System.out.println(......);"即可;再者,当i=0时分母为零且当i<3与i>=3的小数点位数不尽相同,故应当分类讨论,在i<3时直接输出,而i>=3时用统一的算法逻辑书写;最后,应当注意小数点位数的大小应当在输出时定义好

解1(Presentation Error)——

public class oj1012 {
    public static void main(String[] args){
        double sum;
        sum=2.5;
        System.out.println("n"+" "+"e");
        System.out.println("- -----------");
        for(int i=0;i<=9;i++){
            DecimalFormat df = new DecimalFormat("###.000000000");
            if(i==0){
                System.out.println("0"+" "+"1");
            }
            else if(i==1){
                System.out.println("1"+" "+"2");
            }
            else if(i==2){
                System.out.println("2"+" "+"2.5");
            }
            else {
                int x=1;
                for(int k=1;k<=i;k++){
                    x*=k;
                }
                sum=sum+1.0/x;//注意x是int类型,必须是“分子必须是1.0”
                System.out.printf("%.9f\n",sum);
            }
        }
    }
}

     在i>=3时,在原基础(2.5)上继续增加1/i!的值,最终得出的结果就是新的值;再在新的值的基础上增加...需要注意的是,每当到新一轮的循环时,阶乘需要重新从1开始

    最终,使用%.9f来输出小数位数为9的结果.(太久没敲代码了,因为百分号忘记敲了)


解2(Accept)——

import java.text.DecimalFormat;
public class oj1012 {
    public static void main(String[] args){
        double sum;
        sum=2.5;
        System.out.println("n"+" "+"e");
        System.out.println("- -----------");
        for(int i=0;i<=9;i++){
            DecimalFormat df = new DecimalFormat("###.000000000");
            if(i==0){
                System.out.println("0"+" "+"1");
            }
            else if(i==1){
                System.out.println("1"+" "+"2");
            }
            else if(i==2){
                System.out.println("2"+" "+"2.5");
            }
            else {
                int x=1;
                for(int k=1;k<=i;k++){
                    x*=k;
                }
                sum=sum+1.0/x;
                System.out.println(i+ " " + df.format(sum));
            }
        }
    }
}

    在这种方法中,我们引入了DecimalFormat类,利用Format()方法进行格式化操作,设置小数点后的位数.

    对于这种DecimalFormat类,我们使用的方法一般使用pattern格式来调用(☆☆☆☆☆):

0 :如果该位存在数字则输出该数字,如果不存在则输出0
# :如果该位存在数字则默认位数,不存在不做任何输出;
. :小数分隔符;
- :负号;
:分组分隔符;
E :科学计数法中分隔位数和指数;
% :放置在数字的前缀或后缀,将数字的数值乘以100,以百分数的形式输出;
' : 当上述特殊符号出现在数字中时,应为特殊符号添加单引号,系统会将该特殊符号当做普通符号处理

import java.text.DecimalFormat;
...
...
DecimalFormat df = new DecimalFormat("###.000000000");//定义小数位数为9
...
...
System.out.println(...df.format(变量));

  故代码会输出9位小数,结合前面的判断语句,符合题设条件,最终能通过OJ系统的检测.

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值