求解释这个代码错在哪里?


 // 25用筛选法求1-1000之内的素数.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main()
{
    int i, k, a[1001];
    for (i = 2; i <= 1000; i++) a[i] = 1;
    float s = sqrt(float(1000));
    for(i = 2; i <= s; i++)
        if (a[i] == 1)
        {
            k = 2 * i;
            while (k <= 1000)
            {
                a[k] = 0;
                k = k + 1;
            }
        }
    for (i = 2; i <= 1000; i++)
        if (a[i] == 1)
            cout << setw(5) << i;
    

}

代码修改如下,供参考:

// 25用筛选法求1-1000之内的素数.cpp : 此文件包含 "main" 函数。
//程序执行将在此处开始并结束。
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main()
{
    int i, k, a[1001]={0};    //修改
                              //for (i = 2; i <= 1000; i++) a[i] = 1;
    int s = (int)sqrt(1000.0);//float s = sqrt(float(1000));
    for(i = 2; i <= s; i++)
    {
        for(k = 2;k*i < 1001; k++)//if (a[i] == 1)
            a[i*k] = 1;        //{
                               //k = 2 * i;
                               //while (k <= 1000)
                               //{
                               //a[k] = 0;
                               //k = k + 1;
                               //}
    }
    for (i = 2; i <= 1000; i++)
        if (a[i] == 0)         //if (a[i] == 1)
            cout << setw(5) << i;
    return 0;
}

#include
#include
using namespace std;
bool isprime(int);

int main()
{
for (int i = 2; i <= 1000; i++)
{
if (isprime(i))
cout << " " << i;
}

}
bool isprime(int k)
{
float m;
m = sqrt(float(k));
for(int i = 2; i<=m; i++ )
{
if (k % i == 0)
return false;
}
return true;
}


int main()
{
    int i, k, a[1001];
    
    a[0] = a[1] = 0;                    // 基本的,0, 1 都不是素数
    
    //21000,假设他们都是素数
    for (i = 2; i <= 1000; i++) a[i] = 1;
    
    float s = sqrt(float(1000));
    
    // 以倍数法进行筛选,即从既有数中删除2的倍数、3的倍数、5的倍数,直到最大数的平方根的倍数为止。
    for(i = 2; i <= s; i++)
        if (a[i] == 1)
        {
            k = 2 * i;
            while (k <= 1000)
            {
                a[k] = 0;
                // k = k + 1;      // 应该是错在这句。k+1肯定不形成倍数,而 k + i 则形成倍数。
                k = k + i;
            }
        }
        
    // 输出筛选所得的素数
    for (i = 2; i <= 1000; i++)
        if (a[i] == 1)
            cout << setw(5) << i;
    

    return 0;
}