用筛选法求质数

测试程序

/// @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'));
}

运行效果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值