如何在没有if语句的情况下做出决定

时间:2016-08-31 21:06:35

标签: java if-statement

我正在学习Java课程,但我们尚未正式学习if语句。我正在研究并看到这个问题:

  

编写一个名为pay的方法,它接受两个参数:TA工资的实数,以及本周TA工作的小时数的整数。该方法应该返回支付TA的金额。例如,看涨期权(5.50,6)应返回33.0。对于8岁以上的任何小时,TA应该获得1.5倍正常工资的“加班”工资。例如,通话费(4.00,11)应该返回(4.00 * 8)+(6.00 * 3)或50.0。

如果不使用if语句,如何解决这个问题?到目前为止,我已经得到了这个,但我坚持定期付款:

public static double pay (double salary, int hours) {

     double pay = 0;

     for (int i = hours; i > 8; i --) {
         pay += (salary * 1.5);
     }
}

17 个答案:

答案 0 :(得分:80)

为避免直接使用ifwhile等流量控制语句,您可以使用Math.minMath.max。对于这个特殊问题,使用循环也不会有效。

他们可能在技术上使用if语句或等效语句,但您已经进行了很多其他标准库调用:

public static double pay (double salary, int hours) {
     int hoursWorkedRegularTime = Math.min(8, hours);
     int hoursWorkedOverTime = Math.max(0, hours - 8);
     return (hoursWorkedRegularTime * salary) +
            (hoursWorkedOverTime  * (salary * 1.5));
}

答案 1 :(得分:54)

由于你使用了for循环,这里只是使用两个for循环的解决方案。

StripeError {errorType = InvalidRequest, errorMsg = "Invalid API Key provided: ", errorCode = Nothing, errorParam = Nothing, errorHTTP = Just UnAuthorized}

这将正常工时的工资总计达到8,然后将加班时间的工资加起来,加班时间为1.5 *工资。

如果没有加班时间,则不会输入第二个for循环,并且无效。

答案 2 :(得分:20)

有几种方法可以解决这个问题,但很难知道允许的是什么(如果你甚至不能使用if)。

我建议使用while循环:

double pay = 0;
while (hoursWorked > 8) {
    pay += (salary * 1.5);
    hoursWorked--;
}
pay += (hoursWorked * salary);

这可行的原因是它会将您的hoursWorked减少到保证小于或等于8的值(假设hoursWorkedsalary都是大于0)。如果hoursWorked <= 8,则永远不会进入while循环。

答案 3 :(得分:20)

如果你真的想要hacky,你可以使用按位运算符:

int otherHours = hours - 8;
int multiplier = (~otherHours & 0x80000000) >>> 31;
otherHours *= multiplier;

return otherHours * 0.5 * salary + hours * salary;

所以基本上,如果otherHours为负数,则不应该支付过高的费用。我们通过选择otherHours的符号位并将其移至最低有效位(0填充)来表示1或0。首先取消它(如果符号位为1,则乘数应为0)

当您将其与otherHours相乘时,如果时间少于8小时,则为0,以便在进行最终计算时不会意外减去任何工资。

答案 4 :(得分:6)

只是为了记录,这里有一个非常接近你被停止的地方的解决方案:

public static double pay (double salary, int hours) {
     double pay = salary * hours;
     for (int i = hours; i > 8; i --) {
         pay += salary * 0.5;
     }
}

答案 5 :(得分:6)

您只需使用三元运算符?:

 pay = hours*salary + ((hours > 8) ? (hours-8)*salary*0.5 : 0); 

- 支付整个工作时间的标准工资,加上8小时以上时间的50%(如果有的话)。

答案 6 :(得分:5)

为了这个目的,可以滥用int的演员。

注意功能

f(x) = 10/9 - 1/(x+1) = 1 + 1/9 - 1/(x+1)
对于0 <= x < 8

介于0和1(不包括)之间,1介于1.2x >= 8之间。将此值投放到int 0 x < 81 x >= 8

这可用于计算结果:

public static double pay(double salary, int hours) {
    int overtime = (int)(10d/9d - 1d/(hours+1));
    return salary * (hours + 0.5 * overtime * (hours - 8));
}

答案 7 :(得分:4)

这是一种使用truncation from integer division的方法,这可能是你在java课程开始时学到的东西。基本上,解决方案是一个不需要ifloopscomparisonslibraries的单线程。

public static double pay(double salary, int hours) {

    //Pay all hours as overtime, and then subtract the extra from the first 8 hours
    double p1 = (hours * 1.5 * salary) - (4 * salary); 

    //In the case where the TA works for less than 8 hours, 
    //subtract all the extra so that ultimately, pay = salary * hours
    double p2 = (hours * 0.5 * salary) - (4 * salary); 

    //When theres no overtime worked, m equals to 1. 
    //When there are overtime hours, m is equals to 0.
    int m = (8 + 7) / (hours + 7);

    //When there are overtime hours, pay is simply equal to p1. 
    //When there are no overtime hours, p2 is subtracted from p1.
    return p1 - m*p2; 
}

答案 8 :(得分:3)

不使用任何条件(隐式或显式)

的解决方案

实际上,您需要计算hours * rate,但如果您有加班费,那么您需要添加overtime_hours * overtime_rate

形式的奖励 伪代码中的

//you need to return:
hours * rate + is_overtime * overtime_time * overtime_rate

,其中

is_overtime = ceiling ( x / (x+1))  # this will be zero when x == 0, in rest 1 
x = integer_division(hours, 8)   # x == 0 if no overtime, in rest a positive integer
overtime_time = hours - 8
overtime_rate = (1.5 - 1) * rate = 0.5 * rate

答案 9 :(得分:1)

(((hours/8)-1)*8 + hours%8)*salary*0.5 + (hours*salary)
                   overtime*salary*0.5 + (hours*salary)

(((   11/8 -1)*8 +    11%8)*     4*0.5 + (   11*     4) = 50
((      1  -1)*8 +       3)*         2 +             44 = 50
((          0)*8 +       3)*         2 +             44 = 50
((             0 +       3)*         2 +             44 = 50
                                     6 +             44 = 50

假设我们有(17小时,4个工资)

(((17/8)-1)*8 + 17%8)*4*0.5 + 17*4 = 86
(    (2 -1)*8 +    1)*4*0.5 +   68 = 86
           (8 +    1)*2     +   68 = 86
                    9*2     +   68 = 86
                     18     +   68 = 86

17-8 = 9是超时

9 * 4 * 1.5 + 8 * 4 = 9 * 6 + 32 = 54 + 32 = 86

答案 10 :(得分:1)

您可以创造性地将while语句用作 if语句

while(hours > 8){
  return ((hours - 8) * salary * 1.5) + (8 * salary);
}
return hours * salary;

答案 11 :(得分:0)

已经有很多好的和更有效的答案,但这是使用while循环和三元运算符的另一个简单选项:

double pay = 0.0;

while(hours > 0){
    pay += hours > 8 ? wage * 1.5 : wage;
    hours--;
}       
return pay;

答案 12 :(得分:0)

使用tanh来确定hours是否低于8

public static double pay (double salary, int hours) {
    int decider = (int)(tanh(hours - 8) / 2 + 1);

    double overtimeCompensation = 1.5;
    double result = salary * (hours * (1 - decider) + (8 + (hours - 8) * overtimeCompensation) * decider);
    return result;
}

decider小于8时,hours变量为0,否则为1.该等式基本上包含两部分:第一部hours * (1 - decider)将用于hours < 8,以及适用于(8 + (hours - 8) * overtimeCompensation) * decider的{​​{1}}。如果hours >= 8,则hours < 8为1且1 - decider为0,因此使用方程式第一部分。如果deciderhours >= 8为0且1 - decider为1,则相反的情况发生,等式的第一部分为0,第二部分乘以1.

答案 13 :(得分:0)

public static double pay(double salary,int hours){

    int extra_hours = hours - 8;
    extra_hours = extra_hours > 0 ? extra_hours : 0;


    double extra_salary = (salary * 1.5) * extra_hours;
    double normal_salary = extra_hours > 0 ? salary * 8 : salary * hours;

    return normal_salary + extra_salary;
}

答案 14 :(得分:-1)

您可以使用三元运算符。只有一行:

return hours>8?(1.5*hours-4)*salary:hours*salary;

答案 15 :(得分:-2)

某些编程语言具有明确的模式匹配功能。因此,例如,在XSLT中,如果正在处理的节点比程序中的其他模板更好地匹配给定的XPATH查询,则会触发给定的模板。

这种&#34;声明&#34;编程是一个比Java更高的抽象级别,但你仍然拥有switch语句,这使你能够通过匹配&#34;来控制你的流程。接近而不是使用显式的if-else结构。

public static double pay (double salary, int hours) {

 double pay = 0;

 for (int i = hours; i > 0;i--){ 
     switch (i){
         case 1:
         case 2:
         case 3: 
         case 4: 
         case 5:
         case 6:
         case 7:            
            pay += (salary);
            break;
         default:
            pay += (salary * 1.5);
            break;
     }
 }
 return pay;
}

话虽如此,对于您的具体示例,您真正需要的是if语句。 switch方法可行,但有点做作。

答案 16 :(得分:-4)

在Tsql中

DECLARE @amount float = 4.00 ,@ hrs int = 11

DECLARE @overtime int ,@ noright bit

SET @overeight =((@ hrs / 8)^ 1)

SET @overtime = CEILING((@ hrs%8)/((@ hrs%8)+ 1.0))*〜@ overeight

- SELECT @hrs * @amount

SELECT((@hrs - (@ hrs%8 *〜@ overeight))* @ amount)+(@overtime *(@ hrs%8 *(@ amount * 1.5)))

(来自上面的Valentin)