查找可被 6 或 7 整除但不能同时被 6 或 7 整除的整数
Posted
技术标签:
【中文标题】查找可被 6 或 7 整除但不能同时被 6 或 7 整除的整数【英文标题】:Finding integers that are divisible by 6 or 7 but not both 【发布时间】:2009-06-27 19:15:32 【问题描述】:我正在尝试编写一个程序来显示 1 到 100 之间可以被 6 或 7 整除的整数但不能同时被 7 整除。
这是我的代码:
import acm.program.*;
public class Problem4 extends ConsoleProgram
public void run()
for (int i = 1; i <= 100; i++)
boolean num = ((i % 6 == 0) || (i % 7 == 0));
if (num == true)
println(i + " is divisible");
上面的代码显示了以下答案: 6,7,12,14,18,21,24,28,30,35,36,42,48,49,54,56,60,63,66,70,72,77 ,78,84,90,91,96,98
现在粗体数字 42 和 84 都可以被 6 和 7 整除。现在如果我将上面代码中的 ||
更改为 &&
,结果只显示 42 和 84。
我应该做些什么改变才能从最终结果中删除这两个数字?
【问题讨论】:
您应该将num == true
更改为 num
【参考方案1】:
XOR 是要走的路。
import acm.program.*;
public class Problem4 extends ConsoleProgram
public void run()
for (int i = 1; i <= 100; i++)
if ( (i % 6 == 0) ^ (i % 7 == 0) )
println(i + " is divisible");
【讨论】:
我想我会退还我的开发者许可证。 我的书只定义了3个逻辑运算符:1)。 ! 2)。 && 3)。 ||它没有提到异或(^) Xor 是二元运算符。 A ^ B 表示 A 或 B,但不能同时表示两者。如果 ^ 对你来说太陌生了,Ibn Saeed,!= 可以用作布尔值的等价物。 直接从我的编辑器中取出代码。不过请注意:显式测试布尔表达式是不好的风格(在 Java 中)。 “如果 (i % 6 == 0 ^ i % 7 == 0) ...” 是首选。 @duffymo:这就是为什么他们不使用异或门来构建芯片,或使用异或来进行加密。更不用说通过 XOR 进行图像处理了。 “让一切尽可能简单,但不要更简单。” - 阿尔伯特爱因斯坦 ;)【参考方案2】:你必须让你的条件看起来像:
boolean num = (i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0);
这基本上是将“但不是两者都”转换为 Java 代码 :)
【讨论】:
你几乎可以把它翻译成单词:(divisible-by-6 OR divisible-by-7) AND NOT (divisible-by-6 AND divisible-by-7) 感谢 Yuval,这也有帮助。 为什么不使用等价于“(a || b) && !(a && b)”的异或运算符“a ^ b”【参考方案3】:您需要额外检查“但不是两者”。我认为应该是:
布尔数 = ((i % 6 == 0) || (i % 7 == 0)) && (i % 42 != 0);
【讨论】:
我的代码中已经有了 boolean num = ((i % 6 == 0) || (i % 7 == 0)); 按回车太快了。查看编辑结果。你的问题不是 Java,而是逻辑。 但是您的代码更像是一种 hack,而不是解决方案,因为事先不知道 42 和 84。 是的。 “但不是两者”说明了一切。我的将捕获 42、84 和其他 6*7 的倍数。这就是“但不是两者”的意思。 我喜欢这个。如上所述,42 不是 hack。它是 6 和 7 的 LCM,所以任何能被 42 整除的数字当然都可以被 6 和 7 整除。很好。【参考方案4】:你也可以试试
boolean num = ((i % 6 == 0) != (i % 7 == 0));
【讨论】:
对于布尔值,^ 与 != 做同样的事情(参见真值表)。毕竟,逻辑双条件(xnor)是逻辑相等,而异或是它的否定。我碰巧更喜欢 !=,主要是因为我使用的某些语言没有布尔异或,而且 != 绰绰有余。许多其他示例包括重复的 mod 计算,这并不可怕,但 mod 可以减慢紧凑的代码:) 太棒了............只有 NOT_EQUAL 到运算符和 mod......两个没有的 XOR。实施.......【参考方案5】:想想能被 6 和 7 整除意味着什么……宇宙和万物生命的答案。
【讨论】:
“银河系漫游指南”摇滚)【参考方案6】:import acm.program.*;
public class Problem4 extends ConsoleProgram
public void run()
for (int i = 1; i <= 100; i++)
boolean num = ((i % 6 == 0) || (i % 7 == 0));
boolean both = ((i % 6 == 0) && (i % 7 == 0));
if ((num == true) && (both == false))
println(i + " is divisible");
【讨论】:
【参考方案7】:这是一个在 C++ 中应该也能正常工作的 sn-p,但改为布尔值...
int value;
if ((value % 6 == 0 && value % 7 != 0) || (value % 6 != 0 && value % 7 == 0))
cout << "Is " << value << " divisible by 6 or 7, but not both? true" << endl;
else
cout << "Is " << value << " divisible by 6 or 7, but not both? false" << endl;
【讨论】:
【参考方案8】:稍微简化的版本
for(int i=1; i<=100; i++)
// Either Divisible by 6 or 7 but not both
if((i%6==0 && i%7!=0) ||( i%7==0 && i%6!=0))
println(i);
【讨论】:
请解释您的回答。以上是关于查找可被 6 或 7 整除但不能同时被 6 或 7 整除的整数的主要内容,如果未能解决你的问题,请参考以下文章
C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。
C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。