突发奇想问一个 Java 的一个小小小问题

2020-07-20 16:29:12 +08:00
 whatCanIDoForYou
/**
*
* 两个数不能同时为偶数
* 分母和分子 取值范围在[1-20]
* @param args
*/
public static void main(String[] args) {
for (int i = 1; i <= 20; i++) {
int first = i;
for (int j = 1; j <= 20 ; j++) {
int second = j;
//如果同时为偶数,则跳出本次循环
if((first%2 == 0) && (second%2==0) )
continue;
System.out.println("首当其冲:"+first +"退而求次:"+ second +",结果等于"+ String.format("%.3f", first / new Double(second)));
}
}
1713 次点击
所在节点    问与答
21 条回复
whatCanIDoForYou
2020-07-20 16:30:06 +08:00
如果您继续往下读可能浪费你的时间(您理解的),当然非常期待您的回复。
whatCanIDoForYou
2020-07-20 16:32:09 +08:00
上面那个方法实现了两个非偶数的判断。但是我突然想 我能不能不写那两句 if 判断,加一些逻辑运算符 在第二个 for 循环去判断。
如果实现了 我觉得就比较 B 格高 哈哈哈哈
在尝试。
也请大家帮忙想下。
pushback
2020-07-20 16:36:57 +08:00
for (int i = 1; i <= 20; i++)
for (int j = 1; j <= 20; j++)
if ((i + j) % 2 ==0)
continue;
然后怎么优化,细说喃
whatCanIDoForYou
2020-07-20 16:38:09 +08:00
@pushback #3 就是没有想好怎么优化,只是突发奇想不想写这两行 判断 能不能在 第二个 for 中 使用 && 解决
whatCanIDoForYou
2020-07-20 16:39:12 +08:00
@pushback #3 而且你这个 + 的判断 也不中啊 铁子 两个奇数也跳走了~~
pushback
2020-07-20 16:43:08 +08:00
哦哦,没审题
Vegetable
2020-07-20 16:43:28 +08:00
first 是奇数时,第二层循环整个就是浪费的, 不应该在输出前判断。
其次,你可以直接 for int i=2;i<=20;i+=2 设置步长为 2 跳过奇数。
最后,在 for 循环当中直接判断好像是不行的,
whatCanIDoForYou
2020-07-20 16:45:20 +08:00
@Vegetable #7 可能是我没有表述太清楚哦 抱歉。 不论奇数还是偶数都是要使用的,但是 在使用两个数的时候不能同时为偶数。再次抱歉
pushback
2020-07-20 16:45:47 +08:00
@Vegetable 如果这两个数组是不规则数组,步长也是不能固定的
remiver
2020-07-20 16:51:15 +08:00
((i | j) & 1) > 0 这种?
Vegetable
2020-07-20 16:52:23 +08:00
@whatCanIDoForYou #8 是我没看清楚.
不能同时为偶数的话,两个数二进制最后一位必须有一个 1,所以 1&(first|second)==1,这个倒是能通过位运算判断
lllue
2020-07-20 16:52:34 +08:00
for (int i = 0; i < 20; i++) {
int first = i+1;
for (int j = 0; j < 20 ; j=j+1+i%2) {
int second = j+1;
//如果同时为偶数,则跳出本次循环
System.out.println("首当其冲:"+first +"退而求次:"+ second +",结果等于"+ String.format("%.3f", first / new Double(second)));
}
}
pushback
2020-07-20 16:57:04 +08:00
// scope 1~20
int[] moArr = {19, 2, 3, 5, 6, 8, 15, 20, 1};
int[] deArr = {6, 7, 3, 2, 12, 18, 11, 19, 9};
for (int i = 0; i < moArr.length; i++) {
int mo = moArr[i];
for (int j = 0; j < deArr.length; j++) {
int de = deArr[j];
{continue;}
}
}
for 第二段是 end 条件,你要在里面进行 continue,有点骚
whatCanIDoForYou
2020-07-20 17:10:53 +08:00
@remiver #10 哈哈哈哈哈 我对于这些奇数还有点懵,我验证了 告诉您

@Vegetable #11 奇数和奇数 的情况呢 好像没有考虑呦
@lllue #12 厉害厉害 学习了 谢谢您
@pushback #13 嘿嘿 这个仅仅是跳过当前不符合条件 下面该干嘛干嘛的。 您这段代码没有实现我的需求哦
Vegetable
2020-07-20 17:15:57 +08:00
@whatCanIDoForYou #14 奇数和奇数也是的,两个奇数相当于(1 or 1) and 1,结果也是 1
pushback
2020-07-20 17:18:03 +08:00
@whatCanIDoForYou 没有,我只是重新罗列了一下,上面说按步长的情况在乱序数组里面不适用
cigarzh
2020-07-20 17:20:41 +08:00
for (int j = 1; j <= 20 ; j=j+((~(i&1)&j&1)==1?2:1)) {

初始化的 ij 不能都为偶数
msg7086
2020-07-20 17:25:07 +08:00
这不是 B 格高,这属于代码混淆,把原本思路清晰的代码改写成一个星期后的自己也看不懂的代码。
whatCanIDoForYou
2020-07-20 17:31:41 +08:00
@Vegetable #15 学习力一波 了解了 谢谢您 哈哈哈哈哈哈



@msg7086 #18 对的,就是 无聊玩一玩 回忆回忆基础的小美好
superJava
2020-07-20 18:19:36 +08:00
public static void main(String[] args) {
IntStream.range(1, 20).forEach(i -> {
IntStream.range(1, 20).filter(j -> !(i % 2 == 0 && j % 2 == 0)).forEach(j -> {
System.out.println("首当其冲:" + i + "退而求次:" + j + ",结果等于" + String.format("%.3f", i / new Double(j)));
});
});
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691623

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX