0

可能重复:
仅使用素数 2、3 和 5 生成序列,然后显示第 n 项 (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++)。我敢肯定有一个更简单的方法。

4

3 回答 3

1

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

于 2013-01-24T06:10:42.740 回答
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 循环来反映这个推理。

于 2013-01-24T08:22:12.940 回答
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;
  }

这应该打印出所有小于 100 的汉明数

于 2013-01-24T09:24:18.053 回答