用C ++计算汉明序列(一个只有2,3和5作为分隔符的数字序列)

时间:2013-01-24 06:01:29

标签: c++ math hamming-numbers

  

可能重复:
  Generating a sequence using prime numbers 2, 3, and 5 only, and then displaying an nth term (C++)

我一直在为此而头脑风暴,我无法解决这个问题。我需要解决以下问题:

  

生成以下序列并在其中显示第n个术语   序列

     

2,3,4,5,6,8,9,10,12,15等.....序列只有素数   2,3,5-

我需要使用基本的C ++,例如while,for,if等。没什么好看的。我之所以无法使用数组,只是因为我对它们了解不多,而且我想了解解决方案的代码。

我没有要求提供完整的解决方案,但我正在寻求指导以解决这个问题......请。

我的问题是,如果序列中的数字可以被除2,3和5之外的任何其他素数整除,我无法弄清楚如何检查数字。

另外,我要说我检查这个号码:

for(int i=2; i<n; i++){
    if(i%2==0){
        cout<<i<<", ";
    }else if(i%3==0){
        cout<<i<<", ";
    }else if(i%5==0){
        cout<<i<<", ";
    }

它不能简单地工作,因为它产生的数字如14,可以除以素数7.所以我需要弄清楚如何确保该序列只是可以被2,3和5整除.....我已经在网上发现了很多关于这个问题的解决方案的材料,但是他们所拥有的解决方案太过先进了,我也无法使用它们(也是其中大多数是其他语言...而不是C ++)。我确信这是一种更简单的方式。

3 个答案:

答案 0 :(得分:1)

将下一个i值存储在临时变量中,然后将其除以2(只要i%2 == 0)。然后尽可能地除以3。然后是5.然后检查,还剩下什么。

答案 1 :(得分:1)

您的代码存在的问题是,您只需检查其中一个主要因素,而不是全部因素。

以你的14为例。你的代码只检查2,3或5是14的因子,这不是你需要的。实际上,你发现2是14的因子,但另一个因素是7,正如你所说的那样。你缺少的是进一步检查7是否只有因子2,3和5(事实并非如此)。你需要做的是消除所有因素2,3和5,看看剩下的是什么。

我们举两个例子:60和42

60

从因素2开始

  • 60%2 = 0,所以现在检查60/2 = 30。
  • 30%2 = 0,所以现在检查30/2 = 15。
  • 15%2 = 1,所以没有更多因素为2。

继续使用因素3

  • 15%3 = 0,所以现在检查15/3 = 5.
  • 5%3 = 2,因此不再有3个因素。

完成因子5

  • 5%5 = 0,所以现在检查5/5 = 1
  • 1%5 = 1,因此不再有5个因素。

我们最终得到1,所以这个数字是序列的一部分。

适用于42

再次,从因素2开始

  • 42%2 = 0,所以现在检查42/2 = 21。
  • 21%2 = 1,因此没有更多因素为2。

继续使用因素3

  • 21%3 = 0,所以现在检查21/3 = 7.
  • 7%3 = 1,因此不再有3个因素。

完成因子5

  • 7%5 = 2,因此不再有5个因素。

我们最终得到7(与1不同),所以这个数字不是序列的一部分。

因此,在您的实现中,您应该在for循环中嵌套3个while循环以反映这种推理。

答案 2 :(得分:0)

这个怎么样?

bool try_hamming(int n)
{
    while(n%2 == 0)
    {
        n = n/2;
    }
    while(n%3 == 0)
    {
        n = n/3;
    }
    while(n%5 == 0)
    {
        n = n/5;
    }
    return n==1;
}

当n是汉明数字时,这应该返回true,否则返回false。所以主要功能可能看起来像这样

 #include<iostream>
 using namespace std;
 main()
 {
      for(int i=2;i<100;++i)
      {
          if(try_hamming(i) )
          cout<< i <<",";
       }
      cout<<end;
  }

这个schould打印出的所有汉明数字都小于100