质数练习 - 循环问题 C++

Prime Numbers Exercise - Loop Issue C++

我正在尝试解决 Stroustrup 书中关于计算和打印 1 到 100 之间的数字是否为质数的练习。

我的代码似乎工作得很好,但是当它在屏幕上打印值时,它是从 6 而不是 2 开始的。

我试图找出原因,但我无法理解其中的原因。

你能帮我一把吗?

非常感谢!

 // Prime Numbers.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"
#include "std_lib_facilities.h"

vector<int> primes = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 };

int primecheck(int x) {

    for (int i : primes) {
        if (x <= primes[i])
            break;
        if (primes[i] == x)
            return 1;
        while (x % primes[i] != 0) {
            --i;
            if (i < 0) {
                return 1;
                break;
            }
            else {
                if (x % primes[i] == 0)
                return 2;
            }
        }
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    for (int i = 1; i <= 100; ++i) {
        if (primecheck(i) == 1) {
            cout << i << " is a Prime Number." << endl;
        }
        else {
            if (primecheck(i) == 2) {
                cout << i << " is not a Prime Number." << endl;
            }
        }
    }

    keep_window_open();

    return 0;
}

for (int i : primes) 不同于 for(int i = 0;i < terminating condition; ++i).

您可以将 for(int i : primes) 视为 "For every int i in the container primes, do something.",将 for(int i = 0; i < terminating condition; ++i) 视为 "for every int i up to terminating condition, do something"

为你的循环试试这个:

for (int i : primes) {
    if (x <= i)
        break;
    if (i == x)
        return 1;
    while (x % i != 0) {
        --i;
        if (i < 0) {
            return 1;
            break;
        }
        else {
            if (x % i == 0)
            return 2;
        }
    }
}
int primecheck(int x) {
   int flag=1;
   for (int i =2;i<x;i++) 
   {
     if(x%i)
       flag=2;   
   }
   return flag;
}

请改变你的函数,避免数组

你的代码错误很大,你应该重写它。 并非所有路径都有 return 语句,您必须使用 i 而不是 prime[i]

有简单的工作代码:

int primecheck(int x) {

    for (int prime : primes) {
       if (x < prime) {
          return 2;
      }else if (x == prime) {
        return 1;
    }

    return 2;
}