找不到黄金一代/有限一代的时间
Not Finding Times of Prime Generation / Limited Generation
这个程序是一个c++程序,它使用eratosthenes的筛子来计算素数。然后假设存储执行此操作所需的时间,并重新进行100次计算,每次存储时间。在这个程序中有两件事我需要帮助:
首先,我只能测试高达4.8亿的数字,我想得到更高的数字。
其次,当我给程序计时时,它只得到第一个计时,然后打印0作为时间。这是不对的,我不知道时钟出了什么问题。-谢谢的帮助
这是我的密码。
#include <iostream>
#include <ctime>
using namespace std;
int main ()
{
int long MAX_NUM = 1000000;
int long MAX_NUM_ARRAY = MAX_NUM+1;
int long sieve_prime = 2;
int time_store = 0;
while (time_store<=100)
{
int long sieve_prime_constant = 0;
int *Num_Array = new int[MAX_NUM_ARRAY];
std::fill_n(Num_Array, MAX_NUM_ARRAY, 3);
Num_Array [0] = 1;
Num_Array [1] = 1;
clock_t time1,time2;
time1 = clock();
while (sieve_prime_constant <= MAX_NUM_ARRAY)
{
if (Num_Array [sieve_prime_constant] == 1)
{
sieve_prime_constant++;
}
else
{
Num_Array [sieve_prime_constant] = 0;
sieve_prime=sieve_prime_constant;
while (sieve_prime<=MAX_NUM_ARRAY - sieve_prime_constant)
{
sieve_prime = sieve_prime + sieve_prime_constant;
Num_Array [sieve_prime] = 1;
}
if (sieve_prime_constant <= MAX_NUM_ARRAY)
{
sieve_prime_constant++;
sieve_prime = sieve_prime_constant;
}
}
}
time2 = clock();
delete[] Num_Array;
cout << "It took " << (float(time2 - time1)/(CLOCKS_PER_SEC)) << " seconds to execute this loop." << endl;
cout << "This loop has already been executed " << time_store << " times." << endl;
float Time_Array[100];
Time_Array[time_store] = (float(time2 - time1)/(CLOCKS_PER_SEC));
time_store++;
}
return 0;
}
我认为问题是你没有重置起始素数:
int long sieve_prime = 2;
目前,这超出了你的循环。转念一想。。。这不是问题所在。这段代码是否经过编辑,将建议纳入Mats Petersson的答案中?我刚刚纠正了错误的压痕。
不管怎样,对于你问题的另一部分,我建议你用char
而不是int
来代替Num_Array
。使用int
来存储布尔值是没有用的。通过使用char
,您应该能够在相同数量的内存中存储大约4倍的值(假设您的int
是32位的,可能是32位)。
这意味着你可以处理多达20亿的数字。由于您使用signed long
而不是unsigned long
作为类型,因此这已接近计算的数字限制。
如果您想使用更少的内存,可以使用std::bitset
,但要注意性能可能会严重受损。
顺便说一下,您应该在main
:的顶部声明您的定时数组
float Time_Array[100];
在使用之前把它放在循环中有点奇怪。
哦,为了以防万一你感兴趣,这是我自己实现的筛子,就我个人而言,我觉得它比你的更容易阅读。。。。
std::vector<char> isPrime( N, 1 );
for( int i = 2; i < N; i++ )
{
if( !isPrime[i] ) continue;
for( int x = i*2; x < N; x+=i ) isPrime[x] = 0;
}
这段代码应该进入您的循环:
int *Num_Array = new int[MAX_NUM_ARRAY];
std::fill_n(Num_Array, MAX_NUM_ARRAY, 3);
Num_Array [0] = 1;
Num_Array [1] = 1;
编辑:这个也需要在循环中:
int long sieve_prime_constant = 0;
当我在我的机器上运行这个程序时,每个循环需要0.2秒。如果我给MAX_NUM_ARRAY加两个零,每次迭代需要4.6秒(直到第20个循环,我厌倦了等待超过1.5分钟)
同意前面的评论。如果你真的想让事情变得更有活力,你不需要存储所有可能值的数组(如int或char),而是只保留素数。然后,你通过迄今为止发现的所有素数来测试每个后续数字的可整除性。现在你只受你能存储的素数的限制。当然,这并不是你想要实现的算法。。。但由于它将使用整数除法,所以速度相当快。类似这样的东西:
int myPrimes[MAX_PRIME];
int pCount, ii, jj;
ii = 3;
myPrimes[0]=2;
for(pCount=1; pCount<MAX_PRIME; pCount++) {
for(jj = 1; jj<pCount; jj++) {
if (ii%myPrimes[jj]==0) {
// not a prime
ii+=2; // never test even numbers...
jj = 1; // start loop again
}
}
myPrimes[pCount]=ii;
}
这并不是你想要的,但也许它很有用。
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 从文本文件中读取时钟时间和事件时间并进行处理
- 具有未知值时的时间复杂性
- 如何减少花费的时间
- C++在变量给定的指定时间内关闭电脑
- rcpp函数中的清理时间很长
- C++:floor unix时间戳到UTC月份
- 如何在c++中录制具有精确帧时间戳的视频
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- KMP算法和LPS表构造的运行时间
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 找不到黄金一代/有限一代的时间