题意整理。

  • 输入一个正浮点数。
  • 按照四舍五入方式取近似值。

方法一(模拟)

1.解题思路

  • 直接将浮点数强转为整数,然后计算小数部分的大小。
  • 如果小数部分大于等于0.5,向上取整。如果小数部分小于0.5,向下取整。

图解展示: alt

2.代码实现

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        //记录浮点数
        float n=sc.nextFloat();
        //如果小数部分大于等于0.5,向上取整
        if(n-(int)n>=0.5){
            System.out.println((int)n+1);
        }
        //如果小数部分小于0.5,向下取整
        else{
            System.out.println((int)n);
        }
    }
}

3.复杂度分析

  • 时间复杂度:只需常数次操作,所以时间复杂度为O(1)O(1)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)

方法二(字符串分割)

1.解题思路

  • 首先利用buffer接收字符串形式的浮点数,然后按“.”对其进行分割。即可得到整数部分和小数部分。
  • 如果小数部分大于等于0.5,向上取整。如果小数部分小于0.5,向下取整。

2.代码实现

import java.io.*;

public class Main{
    public static void main(String[] args){
        //输入正浮点数值
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String s;
        
        try{
            while((s=br.readLine())!=null){
                //用"."将浮点数分割
                String[] str=s.split("\\.");
                //如果小数部分大于等于5,向上取整
                if(str[1].charAt(0)>='5'){
                    System.out.println(Integer.parseInt(str[0])+1);
                }
                //如果小数部分小于5,向下取整
                else{
                    System.out.println(Integer.parseInt(str[0]));
                }
            }
        }
        catch(IOException e){
            
        }
    }
}

3.复杂度分析

  • 时间复杂度:由于浮点数限制在32位以内,字符串分割的复杂度为浮点数的长度,所以时间复杂度为O(1)O(1)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)