我正在学习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);
}
}
答案 0 :(得分:80)
为避免直接使用if
或while
等流量控制语句,您可以使用Math.min
和Math.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
的值(假设hoursWorked
和salary
都是大于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.2
和x >= 8
之间。将此值投放到int
0
x < 8
和1
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课程开始时学到的东西。基本上,解决方案是一个不需要if
,loops
,comparisons
,libraries
的单线程。
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,因此使用方程式第一部分。如果decider
,hours >= 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)