【问题标题】:Trying to obtain sum of random prime numbers read from a file?试图获得从文件中读取的随机素数的总和?
【发布时间】:2017-09-30 08:16:22
【问题描述】:

我正在尝试从文件中的列表中读取随机数量的数字。从这些数字中,我需要确定数字本身是否为素数,然后我需要将所有素数相加得到它们的总和。

我的这段代码有问题。我有点迷失了如何去获取那些是素数的值并存储它们,这样我就可以将它们加在一起以获得它们的累积总和。我认为这部分代码将进入我的else if 块,但我不是 100% 确定。有人能指出我正确的方向和/或给我一个例子吗?如果我想获得他们的平均值,我可以用类似的方式获得他们的总和吗?

另外,从我的列表中提取了多个值,所以如果我使用单个变量来表示一个素数,该变量是否会在每次整个循环迭代时将自身重置为它找到的下一个素数?

bool primeCalc()
{
    int number;
    bool primeValue = true;
    int i;
    while (inputFile >> number)
    {
        for (i = 2; i <= number / 2; ++i)
        {
            if (number % i == 0)
            {
                primeValue = false;
                break;
            }
            else if (number % i > 0)
            {
                // some code to store number value for sum; 

            }
        }
}

【问题讨论】:

  • 我强烈建议您编写一个函数,该函数接受一个数字并返回 truefalse,具体取决于该数字是否为素数
  • 您不需要存储它们。只需测试当前数字是否为素数。如果是,请将其添加到总数中。
  • 您可以改进主要测试。你只需要在i * i &lt;= number进行测试;您可以在循环外测试“被 2 整除”,然后在循环中测试奇数。这从根本上减少了测试量并显着加快了代码速度。这些只是改进测试的小步骤,但它们足以产生巨大的影响。例如,测试 37,您的代码经过 18 次迭代,但建议的代码经过 3 次迭代。并且随着数字大小的增加,收益也会增加。您的代码将执行 498 次迭代来测试 997;另一种选择 15.

标签: c++ file variables nested-loops primes


【解决方案1】:

为什么要存储它们并浪费空间?当它们来自流时执行它,如下所示:

int sum = 0;
while(inputFile >> number)
{
  if(isPrime(number))
    sum += (number);
}

其中isPrime 可以是这个原型的函数:bool isPrime(int number);,如果number 是素数,则返回true,否则返回false。

【讨论】:

  • 你的实际函数返回int;您的示例原型返回bool。 C 编码太多?当您发现复合材料时为什么不return false; 而在没有任何候选因素时最后只有return true;?它简化了循环测试。如果您尽快返回,else 也将变得不必要。
【解决方案2】:

首先,您不必检查直到数字/2,检查直到数字的平方根就足够了。也就是替换

for (i = 2; i <= number / 2; ++i) {
    // stuff
}

for (i = 2; i <= sqrt(number); i++) {
    // stuff
}

而且你不需要 else 语句。只需在 if 语句中定义一个整数变量来累积素数,例如:

if(primeValue) acc+=number;

在 for 循环之后,在 while 循环内。您还需要在 for 循环之前和 while 循环内再次将 primeValue 设置为 true。

如果您想要这些数字的平均值,您可以使用一个计数器并在累积总和的地方增加它,在 while 循环之后,您可以将总和除以计数器。

【讨论】:

  • 请注意,在每次迭代中计算 sqrt(number) 并不是一个好主意,尽管现代优化编译器可能会为您避免它。使用sqrt() 也涉及到double 的转换、计算和转换回int 的过程。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多