【问题标题】:Prime factor in c++ code does not work for all inputsc++ 代码中的素数因子不适用于所有输入
【发布时间】:2017-06-11 13:43:45
【问题描述】:

我想,这段代码会给我输入合成数的最大素数。但是,它适用于某些输入,但不适用于其他输入。

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
int num=1, sum, count=0, test;
cin>>test;
while(num<=(sqrt(test)))
{
    if(test%num==0)
    {
        for (int prime=2; num>prime; prime++)
        {
            if(num%prime==0)
            count ++;
        }
        if (count == 0)
            sum=num;
    }
    num++;
}
cout<<sum;
}

不起作用的示例:

输入:6,预期:3,得到:2;

输入:540,预期:5,得到:3;

输入:600,预期:5,得到:3;

谁能告诉我要改什么?

【问题讨论】:

  • 请举例说明它不起作用。即输入和预期的内容
  • 还将sqrt移出while条件以提高速度
  • 您将搜索限制为不大于sqrt(test) 的数字。这意味着,至少对于两个素数乘积的数字,您只能找到两者中较小的一个。在这种情况下,较小的素数一定是&lt;= sqrt(test),较大的素数是&gt;= sqrt(test)
  • 当然不行,因为3&gt;sqrt(6).
  • 谢谢你们指出所有这些

标签: c++ prime-factoring


【解决方案1】:

如果你想要最大的质因数,你需要一直检查到test/2。例如。对于 38 岁,您目前最多只能检查 6 次,错过 19 次。

此外,您需要在每次测试后休息计数。

【讨论】:

    【解决方案2】:

    你必须添加

    count = 0

    之后

    if (count == 0) sum = num;

    同样,当输入数是素数时,最大素数除数就是输入数本身。在这种情况下,变量 sum 从未初始化。在程序的开头将其初始化为0,然后在while循环添加

    if (sum == 0) sum = test;

    【讨论】:

    • 我认为它只适用于复合材料,因为这很容易
    【解决方案3】:

    有点晚了,但还是:

      int main() {
      auto num = 1;
      auto sum = 0;
      auto count = 0;
      auto test = 0;
    
      std::cin >> test;
    
      while (num <= test / 2) {
        count = 0;
        if (test % num == 0) {
          for (auto prime = 2; num > prime; prime++) {
            if (num % prime == 0) count++;
          }
          if (count == 0) sum = num;
        }
        num++;
      }
      std::cout << sum;
    }
    

    您可以使用自动。同样作为一般提示:不要使用“使用命名空间标准”。在大型项目中工作时,习惯于编写 std:: 将为您省去一些麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      相关资源
      最近更新 更多