下面是一些代码,根据输入获得下一个素数。我正在测量操作完成所需的纳秒时间。
我在Visual Studio 2017(社区版)中使用C ++。我输入的一些数字的结果是300纳秒,小数(1-100)到800纳秒(1,000,000,000和更高)。但是,如果我输入65535,我得到97767纳秒。但是当我输入65533时,它是438纳秒,当我输入65539时,它是487纳秒。
我的问题是:为什么65535需要更长的时间来计算,但对于高于或低于它的其他数字,它会显着降低?
#include "stdafx.h"
#include <string>
#include <iostream>
#include <chrono>
bool isPrime(int num)
{
int divisor = 3;
while (divisor != INT_MAX)
{
if (divisor % 2 == 0)
{
divisor++;
}
if (num % divisor == 0)
{
return true;
}
divisor += 2;
}
return false;
}
int findNextPrime(int num)
{
while (num != INT_MAX)
{
if (num % 2 == 0)
{
num++;
}
else
{
num += 2;
}
if (isPrime(num))
{
return num;
}
else
{
num++;
}
}
return -1;
}
int main()
{
int candidatePrime;
std::string str;
std::cin >> candidatePrime;
const auto start = std::chrono::high_resolution_clock::now();
const int nextPrime = findNextPrime(candidatePrime);
const auto end = std::chrono::high_resolution_clock::now();
std::cout << nextPrime << std::endl;
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count()
<< " nanoseconds" << std::endl;
std::cin >> str;
return 0;
}
答案 0 :(得分:3)
首先,你的bool isPrime(int num)
剂量不检查数字是否为素数。以25为例来试试吧。你应该首先尝试解决这个问题。另请查看Determining if a number is prime
但要回答你的问题:
当您输入65533时,您使用65535调用 is_prime ,该值可被3整除,因此您的while (divisor != INT_MAX)
循环只会运行一次。
当您输入65535时,您使用65537(这是一个素数)调用 is_prime ,因此您的while (divisor != INT_MAX)
循环将运行~32767次。
对于素数而言,你的功能需要更长的时间来运行才是正常的。