【发布时间】:2014-01-03 22:03:47
【问题描述】:
目前我有两个功能:
- 取素数来生成。
- 第二个取素数的上限来生成。
它们是这样编码的(在 C++ 中):
prime_list erato_sieve(ul_it upper_limit)
{
prime_list primes;
if (upper_limit < 2)
return primes;
primes.push_back(2); // Initialize Array, and add 2 since its unique.
for (uit i = 3; i <= upper_limit; i += 2) // Only count odd numbers
{
flag is_prime = true;
for (uit j = 0; j < primes.size(); ++j)
{
if ((i % primes[j]) == 0)
{
is_prime = false;
break;
}
}
if (is_prime)
{
primes.push_back(i);
}
}
return primes;
}
还有:
prime_list erato_sieve_num(ul_it MAX)
{
prime_list primes;
if (MAX == 0)
return primes;
primes.push_back(2); // Initialize Array, and add 2 since its unique.
uit i = 3;
while (primes.size() < MAX) // Only count odd numbers
{
flag is_prime = true;
for (uit j = 0; j < primes.size(); ++j)
{
if ((i % primes[j]) == 0)
{
is_prime = false;
break;
}
}
if (is_prime)
{
primes.push_back(i);
}
++i;
}
return primes;
}
其中定义了以下类型:
typedef bool flag;
typedef unsigned int uit;
typedef unsigned long int ul_it;
typedef unsigned long long int ull_it;
typedef long long int ll_it;
typedef long double ld;
typedef std::vector<ull_it> prime_list;
(如果您喜欢或不喜欢,请随意使用它们。查找替换会解决这个问题。我使用它们来使代码阅读更多我的想法)
我试图将它们变成一个重载的“函数”,但它们两个具有相似的论点。我担心它们之间的选择会归结为单独的类型,这会导致难以调试的问题。
我的第二个选择是创建一个类,但我很尴尬地说..,我以前从未使用过类。完全没有。所以我不知道该怎么做,而且文档有点……稀疏?
无论如何,如果有人愿意帮助我一点点,将不胜感激。文档总是很有帮助的,也欢迎任何指针。
编辑
正如我所说,我的部分选项是一个类。我完全确定如何制作一个将这两者结合起来的类。
【问题讨论】:
-
如果您打算实施埃拉托色尼筛法,您所拥有的并没有做到。
-
怎么不呢?它检查一个数字是否有以前找到的素数作为因子,如果没有,则将其添加到列表中。
-
这不是埃拉托色尼筛的作用。它从 2 开始,一直到最大值的平方根,消除当前数字的倍数(跳过已经消除的倍数)。有一个不错的解释here
标签: c++ class overloading