微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试解决一个问题,但我编写的代码并没有为大量数字提供输出为什么?

如何解决尝试解决一个问题,但我编写的代码并没有为大量数字提供输出为什么?

我正在尝试这个问题。

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 的任何输出。谁能解释为什么它不适用于大值,并告诉应该在这些中进行哪些更改以获得正确的输出

解决方法

以下代码片段来自 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 开始数数意味着您从低端的素因数开始。 (计数时非质数的数字只是不能作为无分数的除数计算出来,同时它们的质数因子分量已经被探测到,因为它们较低。)

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。