查找可被 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 整除。现在如果我将上面代码中的 || 更改为 &amp;&amp;,结果只显示 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 整除的整数的主要内容,如果未能解决你的问题,请参考以下文章

js中如何判断两个数是不是整除

超级丑数--用堆查找解决

codeforce#682 T1

C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。

C语言试题十三之求出1到100之内能被7或者11整除,但不能同时被7和11整除的所有整书,并将他们放在a所指的数组中,通过n返回这些数的个数。

3-素数对中间的数能被6整除