【问题标题】:Trying out a problem but code I had written is not giving output for large numbers. why?尝试一个问题,但我编写的代码没有给出大量的输出。为什么?
【发布时间】:2021-04-14 09:19:56
【问题描述】:

我正在尝试这个问题。

13195的质因数是5、7、13和29。600851475143的最大质因数是多少?

我写了以下代码:

#include<iostream>
#define num 600851475143
using namespace std;
int isprime(unsigned long long int n)
{
  unsigned long long int c=0;
  for(unsigned long long int i=2;i<n;i++)
  {
      if(n%i==0)
      {
          c++;
          break;
     }
  }
  if(c==0)
  {
      return 1;
  } 
  else
  {
      return 0;
  }
 }
 int main()
 {
 unsigned long long int a,i,n=num;
 while(n-- && n>1)
 {  
     if(isprime(n)==1 && num%n==0)
     {
         cout<<n;
         break;
     }
 }
 return 0;
}

代码出现的问题是它适用于 13195 和其他小值。但是没有得到 600851475143 的任何输出。任何人都可以解释为什么它不适用于大值,并告诉应该在这些中进行的更改以获得正确的输出。

【问题讨论】:

  • 可能程序运行了很长时间才能完成,而您的输出中没有换行符,这会刷新标准输出缓冲区。在代码中添加一些couts,看看它是否还在运行。
  • 每 100 000 次迭代添加一次打印,您要查找的数字约为 7000-ish,您可以估计从 600851475143 迭代到 7000 需要多长时间。
  • 程序的编写方式:它可能还没有达到最大质数。最大的素数是6857。因此,您需要运行超过 6000 亿次“isprime”检查。其中,循环遍历整个数字。
  • 您的代码对于 'c' 的变量/值和中断来说过于复杂。只需将 c 放在一起并放入 return 0 而不是 break。除此之外,您只需要探测除以其他较小的素数,直到所讨论的数字的平方根。
  • 我建议更改检查顺序,模数比isprime 快​​。 (一旦你找到一个除数,你也可以“减少”n)。

标签: c++ c++11 math


【解决方案1】:

以下代码 sn-ps 来自 c(但在 c++ 中也应该可以很好地运行):

#include <stdio.h>

#define uIntPrime       unsigned long long int
#define uIntPrimeFormat "llu"

uIntPrime findSmallestPrimeFactor(uIntPrime num)
{
    uIntPrime limit = num / 2 + 1;

    for(uIntPrime i=2; i<limit; i++)
    {
        if((num % i) == 0)
        {
            return i;
        }
    }

    return num;
}

uIntPrime findLargestPrimeFactor(uIntPrime num)
{
    uIntPrime largestPrimeFactor = 1; // start with the smallest possible value

    while (num > 1) {
        uIntPrime primeFactor = findSmallestPrimeFactor(num);
        if (primeFactor > largestPrimeFactor) largestPrimeFactor = primeFactor;
        num = num / primeFactor;
    }

    return largestPrimeFactor;
}

这是怎么工作的?

(第一个函数:)从 2 开始计数意味着您从低端的素数开始。 (计数时非素数的数字不能作为无分数除数,同时它们的素数因子分量已经被探测过,因为它们较低。)

(第二个函数:)如果找到一个有效因子,则从相关数字中提取该因子。因此,可以重复在提取的数字中搜索现在最小的素数。 (条件可能是多余的,因为无论如何都会首先找到较低的数字 - 但它可能类似于您熟悉的搜索模式 - 就像在最小/最大/其他条件搜索中一样。我现在把它留给你来证明用你自己的主程序进行测试是对还是错。) 停止条件是关于提取最后一个因子意味着将值除以自身并得到 1 的值。

(当然还有很大的空间可以加快速度!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2021-09-06
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多