黑马程序员技术交流社区

标题: java面试之编程题 [打印本页]

作者: 唯我独赞mo    时间: 2015-11-11 21:11
标题: java面试之编程题
企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,注意定义时要把奖金定义为长整形。求利润是60.0万时,应发放奖金数。
  1. public class test {
  2.         public static void main(String[] args) {
  3.                 double x = 0, y = 0;
  4.                 System.out.print("输入当月利润(万):");
  5.                 Scanner s = new Scanner(System.in);
  6.                 x = s.nextInt();
  7.                 if (x > 0 && x <= 10) {
  8.                         y = x * 0.1;
  9.                 } else if (x > 10 && x <= 20) {
  10.                         y = 10 * 0.1 + (x - 10) * 0.075;
  11.                 } else if (x > 20 && x <= 40) {
  12.                         y = 10 * 0.1 + 10 * 0.075 + (x - 20) * 0.05;
  13.                 } else if (x > 40 && x <= 60) {
  14.                         y = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (x - 40) * 0.03;
  15.                 } else if (x > 60 && x <= 100) {
  16.                         y = 20 * 0.175 + 20 * 0.05 + 20 * 0.03 + (x - 60) * 0.015;
  17.                 } else if (x > 100) {
  18.                         y = 20 * 0.175 + 40 * 0.08 + 40 * 0.015 + (x - 100) * 0.01;
  19.                 }
  20.                 System.out.println("应该提取的奖金是 " + y + "万");
  21.         }

  22. }
复制代码




作者: 隔壁马良    时间: 2015-11-11 22:21
奖金不是定义为长整形么,怎么是double了
作者: ppaapc    时间: 2015-11-11 22:27
有点意思
作者: 唯我独赞mo    时间: 2015-11-12 14:39
隔壁马良 发表于 2015-11-11 22:21
奖金不是定义为长整形么,怎么是double了

当时笔试时就是这样写的,对啊,长整形应该是long,多谢指出
作者: lyg0374    时间: 2015-11-12 15:35
隔壁马良 发表于 2015-11-11 22:21
奖金不是定义为长整形么,怎么是double了

因为x,y要与小数运算
作者: lyg0374    时间: 2015-11-12 15:36
我感觉应该是这样的
作者: 刘旭波    时间: 2015-11-12 20:16
double有问题吗,计算过程中出现小数了啊
作者: 唯我独赞mo    时间: 2015-11-12 20:19
刘旭波 发表于 2015-11-12 20:16
double有问题吗,计算过程中出现小数了啊

要求的是长整形,现在写的是浮点型
作者: 隔壁马良    时间: 2015-11-12 23:37
唯我独赞mo 发表于 2015-11-12 14:39
当时笔试时就是这样写的,对啊,长整形应该是long,多谢指出

是不是可以把60万写成600000(类推),直接定义长整形,对运算中对有小数出现的式子进行强制转换符号避免double
作者: ll5353231    时间: 2015-11-12 23:42
面试的题目这些吗?
作者: 唯我独赞mo    时间: 2015-11-13 00:06
ll5353231 发表于 2015-11-12 23:42
面试的题目这些吗?

还有关于数据库的
作者: 小地瓜    时间: 2015-11-13 00:10
我想说这个题目不科学,为啥到后最,提成是越来越少呢,按照正常的不是越来越高么?
作者: 小地瓜    时间: 2015-11-13 00:12
是不是可以优化呢,这样做是不是就是像按计算机一样?没有看到代码的智能化
作者: 唯我独赞mo    时间: 2015-11-13 16:10
小地瓜 发表于 2015-11-13 00:10
我想说这个题目不科学,为啥到后最,提成是越来越少呢,按照正常的不是越来越高么?  ...

这个题目是很早以前的了,一般公司的笔试都是差不多,还有杨辉三角出现的频率也特别高
作者: 女神    时间: 2015-11-13 18:31
很六的说    赞一个
作者: 女神    时间: 2015-11-13 19:27
本帖最后由 女神 于 2015-11-13 19:41 编辑

package com.heima.Salary;

import java.util.Scanner;

/*
* 企业发放的奖金根据利润提成。
* 利润(I)低于或等于10万元时,奖金可提10%;
* 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;
* 20万到40万之间时,高于20万元的部分,可提成5%;
* 40万到60万之间时高于40万元的部分,可提成3%;
* 60万到100万之间时,高于60万元的部分,可提成1.5%,
* 高于100万元时,超过100万元的部分按1%提成,
* 注意定义时要把奖金定义为长整形。求利润是60.0万时,应发放奖金数。
*/
public class Salart_Demo {
        public static void main(String[] args) {
                double profit = getProfit(); //获取录入的利润值(以万为单位)
                long bonus = getBonus(profit);//通过利润获取奖金值(以元为单位)
                System.out.println("员工的利润为" + profit / 10000 + "万元,奖金为" + bonus + "元");
        }
       
        //获取员工利润
        public static double getProfit() {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入代表员工利润的数值(以万为单位,可以有小数)");
                while (true) {
                        try {
                                String s = sc.nextLine();
                                double profit = Double.parseDouble(s);
                                return profit * 10000;
                        } catch (NumberFormatException e) {
                                System.out.println("您的输入有误,请重新输入");
                        }
                }
        }
       
        // 计算奖金
        public static long getBonus(double profit) {
               
                long num = ((Double)profit).longValue() / 10000;                //这里的double不能自动装箱为Double类型调用longValue()方法吗?
                if (num <= 0) {
                        return 0;
                }else if (num > 0 && num <= 10) {
                        return ((Double)(profit * 10 / 100)).longValue();
                }else if (num > 10 && num <= 20) {
                        return getBonus(100000) + ((Double)((profit - 100000) * 75 / 1000)).longValue();
                }else if (num > 20 && num <= 40) {
                        return getBonus(200000) + ((Double)((profit - 200000) * 5 / 100)).longValue();
                }else if (num > 40 && num <= 60) {
                        return getBonus(400000) + ((Double)((profit - 400000) * 3 / 100)).longValue();
                }else if (num > 60 && num <= 100) {
                        return getBonus(600000) + ((Double)((profit - 600000) * 15 / 1000)).longValue();
                }else {
                        return getBonus(1000000) + ((Double)((profit - 1000000) * 1 / 100)).longValue();
                }
        }
       
       
}


作者: 杨凯瑞    时间: 2015-11-13 19:30
有用啊  来看看
作者: 大自然的搬运工    时间: 2015-11-13 19:31
6666666666666666
作者: 百变乔巴    时间: 2015-11-13 19:54
面试成功了吗
作者: 唯我独赞mo    时间: 2015-11-13 20:20
女神 发表于 2015-11-13 19:27
package com.heima.Salary;

import java.util.Scanner;

定义了两个方法,分别获取利润和奖金,两个类型之间的转换非常好,感谢啊
作者: 唯我独赞mo    时间: 2015-11-13 20:24
隔壁马良 发表于 2015-11-12 23:37
是不是可以把60万写成600000(类推),直接定义长整形,对运算中对有小数出现的式子进行强制转换符号避免 ...

可以参考16楼写得代码,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2