检查数字是否被许多其他人均匀分割

问题描述:

我有一个编程问题,希望我检查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个数字)。有任何想法吗?

+1

提示:如果一个数由12整除那么它也__must__ 2,3,4和6 – tkausl

+0

也不匀,你可以通过'(十六进制%2代替'六角%2 == 0' )'等等。 – VolAnd

+1

'hex%1 == 0' ???真?是否像'0 == 0'? – VolAnd

如果a[i] | x1 <= i <= n,然后lcm(a[1], ..., a[n]) | x

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


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

我只是有点困惑,你是怎么得到27720号的?我假设它可以被数字1到12整除? – Gardenia

+0

@花园27720是1,2的租赁公倍数,... 12 – delta

+0

哦,我明白了,好吧谢谢你! – Gardenia

您可以简单地使用另一个用于循环以摆脱long 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; 
} 
+0

与什么不同张贴在问题?在这里你做了不必要的迭代,例如你正在检查3和4和12的除法,如果除以3和4,它将自动除以12.因此,计算1到12的LCM,检查可分性那。 – instance

+0

@实例没有违法。我同意你的评论。这只是实现目标的一种替代方式,而不是使用long if语句。 –

+0

但你的代码仍然是错误的,OP希望找到可以被1到12中的所有数字整除的数字计数。你正在做的是,对于每个“十六进制”,如果用“i” 。如果所有1到12整除,你只需要增加1。 – instance