【问题标题】:Checking if a number divides evenly by many others检查一个数字是否除以许多其他数字
【发布时间】:2016-12-13 06:15:41
【问题描述】:

我有一个编程问题,要我检查 30,000 个六边形数字(由公式 H(n) = n(2n-1) 给出),其中有多少可以被数字 1 到 12 整除。

我的代码如下:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int hex, count = 0;

    for (int n = 1; n <= 30000; n++)
    {
        hex = n * ((2 * n) - 1);

        if (hex % 1 == 0 && hex % 2 == 0 && hex % 3 == 0 && hex % 4 == 0 && hex % 5 == 0 && hex % 6 == 0 && hex % 7 == 0 && hex % 8 == 0 && hex % 9 == 0 && hex % 10 == 0 && hex % 11 == 0 && hex % 12 == 0)
        {
            count++;
        }
    }

    cout << count << endl;
}

现在我知道我现在在 if 语句中的检查效率非常低,所以我想知道是否有更简单的方法来检查数字?我尝试使用 for 循环,但无法让它工作(因为它一次只检查 1 个数字)。有什么想法吗?

【问题讨论】:

  • 提示:如果一个数字被 12 整除,那么它必须也被 2、3、4 和 6 整除。
  • 也可以将hex % 2 == 0替换为!(hex % 2)
  • hex % 1 == 0 ???真的吗?是不是类似于0 == 0
  • using namespace std; 然后声明变量 hexcount 是一个等待完成的曼哈顿计划。
  • 我明白你在说什么 VolAnd,放置 %1 是不必要的,感谢您的建议。还要感谢 tkausl,它确实缩短了很多。

标签: c++ if-statement for-loop main iostream


【解决方案1】:

如果a[i] | x 对应1 &lt;= i &lt;= n,那么lcm(a[1], ..., a[n]) | x

对于这种情况,只需要检查lcm(1,2,...,12) | h,即h % 27720 == 0


  1. https://en.wikipedia.org/wiki/Least_common_multiple

【讨论】:

  • 我有点疑惑,你是怎么得到27720这个数字的?我假设它可以被数字 1 到 12 整除?
  • @Gardenia 27720 是 1,2,...12 的租赁公倍数
  • 我接近它的方式是,你需要 1..12 中的所有素数。所以你应该检查 2³.3².5.7.11 (这是另一种说法“1..12 的 lcm 是多少?”)
  • @MartinBonner 是的,这是计算 lcm 的唯一方法
【解决方案2】:

您可以简单地使用另一个 for 循环来摆脱您使用过的长 if 语句。

#include <iostream>
#include <cstring>

using namespace std;

int main(){
    int hex, count = 0;
    int divider = 12;

    for (int n = 1; n <= 30000; n++){
        hex = n * ((2 * n) - 1);

        int subcount = 0;
        for (int i = 1; i <= divider; ++i){
            if (hex % i == 0){
                ++subcount;
                if(subcount == devider){
                     ++count;
                }
            }
        }
    }

    cout << count << endl;
}

【讨论】:

  • 与所发布的内容有何不同?在这里您进行了不必要的迭代,例如您正在检查除以 3 和 4 和 12,如果它同时除以 3 和 4,它将自动除以 12。因此计算 1 到 12 的 LCM,检查可除性那个。
  • @instance 没有冒犯。我同意你的评论。这只是实现目标的替代方法,而不是使用长 if 语句。
  • 但您的代码仍然是错误的,OP 希望找到可被 1 到 12 的所有数字整除的数字计数。您正在做的是,对于每个“十六进制”,您都在增加“计数”如果它除以“i”。只有当它可以被所有 1 整除到 12 时,您才需要将 count 增加 1。
  • 将 if 语句更改为 if(hex%i) break; else if(i==divider) count++;
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2020-10-23
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
相关资源
最近更新 更多