测试程序
/// @file exam_1_1.c
/// @brief exam_1_1 用筛选法求100以内的质数
/**
质数(prime number)又称素数,有无限个。
一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,
换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
根据算术基本定理,每一个比1大的整数,要么本身是一个质数,
要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,
那么写出来的形式是唯一的。最小的质数是2。
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <memory.h>
/// 用CL编译, 不知道为啥不能使用 bool 类型, 自己定义一个
/// error C2065: 'bool' : undeclared identifier
/// bool 不是C语言内建的数据类型么?
#define LS_DEFINE
#ifdef LS_DEFINE
typedef char bool;
#define true 1
#define false 0
#endif // #ifdef LS_DEFINE
void clearScreen();
void procTask();
void ListPrimeNumber(long iMaxPrimeNumber);
void printIntArray(int* pInt, long lLenArr);
void clear_input_buffer();
int main(int agrc, char** argv)
{
clearScreen();
procTask();
getchar();
return 0;
}
void procTask()
{
long iMaxPrimeNumber = 0;
printf("please input max Prime number:");
scanf("%d", &iMaxPrimeNumber);
clear_input_buffer();
printf("prime numbers list:\n");
ListPrimeNumber(iMaxPrimeNumber);
}
void ListPrimeNumber(long iMaxPrimeNumber)
{
/// 用筛选法求100以内的质数
long iMaxFind = 0;
long lFind = 0;
long lIndex = 0;
int* pInt = NULL;
bool bFirst = true;
do
{
pInt = malloc(iMaxPrimeNumber * sizeof(int));
if (NULL == pInt)
{
break;
}
for (lIndex = 0; lIndex < iMaxPrimeNumber; lIndex++)
{
if ((0 == lIndex)
|| (1 == lIndex))
{
*(pInt + lIndex) = -1; ///< 0, 1 不是质数
continue;
}
*(pInt + lIndex) = lIndex;
}
iMaxFind = (long)sqrt(1.0 * iMaxPrimeNumber);
for (lFind = 2; lFind <= iMaxFind; lFind++)
{
printf(""); ///< bp
bFirst = true;
for (lIndex = lFind; lIndex < iMaxPrimeNumber; lIndex+=lFind)
{
if (-1 == *(pInt + lIndex))
{
continue;
}
if (bFirst)
{
bFirst = false;
continue; ///< 第一个数是质数
}
*(pInt + lIndex) = -1;
}
}
printf("");
printIntArray(pInt, iMaxPrimeNumber);
} while (0);
if (NULL != pInt)
{
free(pInt);
pInt = NULL;
}
}
void printIntArray(int* pInt, long lLenArr)
{
long lIndex = 0;
int iRowDispCnt = 0;
const int iRowDispCntMax = 8;
do
{
if (NULL == pInt)
break;
for (lIndex = 0; lIndex < lLenArr; lIndex++)
{
if (*(pInt + lIndex) < 0)
continue;
printf("%9ld ", *(pInt + lIndex));
if (++iRowDispCnt >= iRowDispCntMax)
{
iRowDispCnt = 0;
printf("\n");
}
}
} while (0);
}
void clearScreen()
{
system("cls");
}
void clear_input_buffer()
{
char ch = '\0';
/// scanf 的回车 0x0a, 留在了buffer里面, 用getchar()还能读的到,
/// clear input buffer
do
{
ch = getchar();
} while ((ch != EOF) && (ch != '\n'));
}
运行效果