为什么我的程序不会识别素数?

时间:2013-11-20 20:03:52

标签: c++ arrays

我正在使用Siera of Erastosthenes方法来制作一个打印所有素数高达1000的程序。程序正在运行但由于某种原因,程序不会删除复合数字。由于我的程序运行,我确定它只是一个逻辑错误,错误在我的identifyPrimes函数中的某处,但我无法找到它。

#include <cstdlib>
#include <iostream>
using namespace std ;

void initializeNumbers ( char number[], int ARRAY_SIZE )
{
    number[0]  =  'I' ; // 'I' means Ignore
    number[1]  =  'I' ;

    for ( int i = 2 ; i < ARRAY_SIZE ; i ++ )
        number[i]  =  'U' ;

    /*  --------------------------------------------------------
        Function indexOfLeastU returns the least index such that
        the character stored at that index is 'U', with the
        exception that -1 is returned if no array element has
        value 'U'.
        -------------------------------------------------------- */
    int indexOfLeastU ( char number[], int ARRAY_SIZE )
    {
        for ( int i = 0 ; i < ARRAY_SIZE ; i ++ )
            if ( number[i] == 'U' )
                return  i ;

        return  -1 ;
    } // end indexOfLeastU function

    /*  --------------------------------------------------------
        Function identifyPrimes identifies which numbers are
        prime by placing 'P's at those indices.
        Composite #'s are marked with 'C's.
        -------------------------------------------------------- */
    void  identifyPrimes ( char number[], int ARRAY_SIZE )
    {
        int  leastU  =  indexOfLeastU ( number, ARRAY_SIZE ) ;
        while ( leastU >= 0 )
            {
                number [leastU]  =  'P' ; // 'P' for Prime

                // mark multiples as Composite ...
                for ( int i = (2 * leastU) ; i < ARRAY_SIZE ; i += leastU)

                    number [leastU]  =  'C' ; // 'C' for Composite
                leastU  =  indexOfLeastU ( number, ARRAY_SIZE ) ;

            } // end while loop
    } // end identifyPrimes function

    /*  --------------------------------------------------------
        Function printPrimes prints those array indices whose
        corresponding elements have the value 'P'.
        -------------------------------------------------------- */
    void printPrimes ( char number[], int ARRAY_SIZE )
    {
        // print the indices at which a 'P' is stored ...
        cout << "\nThe prime numbers up to 1000 are:\n\n" ;
        for ( int i = 0 ; i < ARRAY_SIZE ; i ++ )
            if ( number[i] == 'P' )
                cout << i << '\t' ;
        cout << endl << endl ;
    } // end printPrimes function

    int main ( )
    {
        // declare & initialize constants ...
        const int  MAX_NUMBER  =  1000 ;
        const int  ARRAY_SIZE  =  MAX_NUMBER + 1 ;

        // declare array ...
        char  number [ ARRAY_SIZE ]  =  { '\0' } ;

        initializeNumbers ( number, ARRAY_SIZE ) ;

        identifyPrimes ( number, ARRAY_SIZE ) ;

        printPrimes ( number, ARRAY_SIZE ) ;
        system("pause");
    } // end main function

3 个答案:

答案 0 :(得分:3)

问题在于:

    // mark multiples as Composite ...
    for ( int i = (2 * leastU) ; i < ARRAY_SIZE ; i += leastU)

        number [leastU]  =  'C' ; // 'C' for Composite

作业应该是:

        number[i] = 'C';

答案 1 :(得分:2)

这里有一个问题。

for ( int i = (2 * leastU) ; i < ARRAY_SIZE ; i += leastU)
    number [leastU]  =  'C'

应该是

number[i] = 'C';

答案 2 :(得分:1)

首先,您应该使用linked-list(您可以使用std :: list)来代替ignor符号。然后你可以删除你现在指定要忽略的元素。

此程序(至少如此处所示)将无法编译,因为您忘记了initializeNumbers的右括号。

接下来,您需要修复此循环:

for ( int i = (2 * leastU) ; i < ARRAY_SIZE ; i += leastU)

                number [leastU]  =  'C' ; // 'C' for Composite

您需要使用i代替leastU