【发布时间】:2019-01-17 07:02:28
【问题描述】:
我正在编写一个程序来创建两个向量来练习比较向量中的元素。第一个向量是 1-100 之间的所有非素数(不是素数)的列表,第二个向量是 1-100 之间的所有数字的列表(向量 number_bank)。我正在使用循环来比较向量中的每个元素。假设数字 5 来自 number_bank(它是一个素数),如果这个数字与 not_prime_numbers 向量中的任何数字都不匹配,那么它将被推回称为素数的第三个向量。如果将像 4 这样的数字与 not_prime_number 列表中的元素进行比较,则它应该与该列表中的数字 4 匹配,并在不将数字推回 prime_numbers 向量的情况下打破循环。正在发生的事情是 1-100 之间的所有数字都被推回。 number_bank 向量中的 4 永远不会等于 not_prime_numbers 向量中的 4,因此循环继续将 4 推回到素数向量中。
更改这些向量中的元素不涉及数学运算,因此不应存在通常与比较浮点数相关的增量误差 (epsilon)。有没有更好的方法来比较这些向量中的元素?
int main()
{
float i = 1.0;
unsigned int n = 0;
std::vector<float>not_prime_numbers;
std::vector<float>number_bank;
std::vector<float>prime_numbers;
while (i < 101.0)
{
for (float j = 1.0;j<(i);++j)
{
float p = i / j;
if (abs(floor(p)) == p&&j!=1.0)
{
not_prime_numbers.push_back(i);
break;
}
}
++i;
}
for (float k = 1.0; k < 101.0; ++k)
{
number_bank.push_back(k);
}
for (unsigned int m = 0; m < number_bank.size(); ++m)
{
while (n < not_prime_numbers.size())
{
if (not_prime_numbers[n] == number_bank[m]) // here is where i try to break the loop
{
break;
}
if (n == (not_prime_numbers.size()-1))
{ // here is where element is pushed back when compared to all loop elements
prime_numbers.push_back(number_bank[m]);
break;
}
if (not_prime_numbers[n] != number_bank[m])
{
++n;
}
}
}
std::cout << "All prime numbers between 0 and 100 are as follows:\n";
for (unsigned int j = 0; j < prime_numbers.size(); ++j)
{
std::cout << prime_numbers[j] << "\n";
}
return 0;
}
我阅读了 .compare 并尝试了它,但它指出左侧需要有一个类结构(也许一个向量没有类结构?)。我是 C++ 新手,非常感谢您的帮助。
【问题讨论】:
-
它指出左侧需要有一个类结构 请始终发布错误消息的确切文本。如果这是 Visual Studio,请从“输出”选项卡 (Alt+2) 复制它
-
你为什么使用浮点类型?素数只是整数,您可以通过使用
%检查余数来解决整数是否为素数。你真的应该切换你的数据类型。 -
@NathanOliver 我使用浮点数是因为我检查它是否不是质数的方式。如果我使用整数,则舍入会导致 1-100 之间的所有数字都被定义为非素数。其目的更多是比较向量元素而不是素数方面。
-
旁注:
floats 的比较可能会变得混乱,因为floats 不能包含许多数字的精确表示,即使可以,有时算术运算的结果也会稍微“中断”号码。换句话说,您认为您正在查看 25,但float实际上持有的是24.999999999999997并且不完全等于 25。有关此主题的更多信息:Is floating point math broken? -
@user4561301 嗯,那么比较两个浮点值的正确语法是什么?一个向量是一个数字库,第二个向量是一系列计算值?
标签: c++ vector floating-point