c++ - 尝试一个问题,但我编写的代码没有给出大量的输出。为什么?
问题描述
我正在尝试这个问题。
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 获得值 1。
(当然还有很大的空间可以加快速度!)
推荐阅读
- svg.js - 不知道元素类型的 CSS 选择器
- sql - 在 ^ 之后取正确的字符串
- r - Tidyquant:如何将股票类型分配给现有列表?
- c# - SemaphoreSlim 似乎不同步
- javascript - click() 方法不起作用控制台返回错误 JavaScript
- javascript - 平板设备上的网络应用程序只有灰色
- java - 访问抽象类方法
- sql-server - 为什么我的 SSIS 包在第一次运行时失败,但在第二次运行时没有?“对象不能从 DBNULL 转换为其他类型”
- c++ - Windows 桌面复制 API AcquireNextFrame 避免 DXGI_ERROR_WAIT_TIMEOUT
- dynamics-crm-2011 - 如何在不破坏 Web UI 的情况下编辑 CRM 工作流 xaml