C 语言求素数

打印 100-200 之间的素数

程序:

// 打印 100-200 之间的素数

// 素数判断的规则:试除法

#include<stdio.h>

int main(void)
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		// 根据试除法需要产生 2 到 i-1
		int j = 0;
		for (j = 2; j < i; j++)
		{
			if (!(i % j))
			{
				break;
			}
		}
		if (j == i) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
		{
			printf("%d is prime.\n", i);
			count++;
		}
	}
	printf("%d primes.\n", count);

	return 0;
}

结果:

101 is prime.
103 is prime.
107 is prime.
109 is prime.
113 is prime.
127 is prime.
131 is prime.
137 is prime.
139 is prime.
149 is prime.
151 is prime.
157 is prime.
163 is prime.
167 is prime.
173 is prime.
179 is prime.
181 is prime.
191 is prime.
193 is prime.
197 is prime.
199 is prime.
21 primes.

但此代码还有很大优化空间.

如果一个数 i 不是素数, 则两个乘机因子至少有一个小于 i 的平方. 因此不必搜索到 i-1, 只需要搜索到 i 的平方根.

优化后的代码:

// 打印 100-200 之间的素数

// 素数判断的规则:试除法

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i = 0;
	int count = 0;
	for (i = 100; i <= 200; i++)
	{
		// 根据试除法需要产生 2 到 i-1
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (!(i % j))
			{
				break;
			}
		}
		if (j >sqrt(i)) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
		{
			printf("%d is prime.\n", i);
			count++;
		}
	}
	printf("%d primes.\n", count);

	return 0;
}

又因为偶数不可能是素数, 因此可以将偶数剔除, 效率将会提升一倍.

优化后的代码:

// 打印 100-200 之间的素数

// 素数判断的规则:试除法

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2)
	{
		// 根据试除法需要产生 2 到 i-1
		int j = 0;
		for (j = 2; j <= sqrt(i); j++)
		{
			if (!(i % j))
			{
				break;
			}
		}
		if (j >sqrt(i)) // 代码执行到该行,可能是因为执行了break,此时i不是素数,也可能是j增加到最后达到i,循环结束了,此时i是素数
		{
			printf("%d is prime.\n", i);
			count++;
		}
	}
	printf("%d primes.\n", count);

	return 0;
}

求指定数字是否是素数

程序:

#include<stdio.h>
#include<stdbool.h>
int main(void)
{
	unsigned long num;
	unsigned long div;
	bool isPrime;

	printf("Please enter an integer for analysis; ");
	printf("Enter q to quit.\n");
	while (scanf("%lu", &num) == 1)
	{
		if (1 == num)
		{
			printf("1 is not a prime.\n");
			printf("Please enter an integer for analysis; ");
			printf("Enter q to quit.\n");
			continue;
		}
		for (div = 2, isPrime = true; (div * div) <= num; div++)
		{
			if (num % div == 0)
			{
				if ((div * div) != num)
				{
					printf("%lu is divisible by %lu and %lu.\n", num, div, num / div);
				}
				else
				{
					printf("%lu is divisible by %lu.\n", num, div);
				}
				isPrime = false;
			}
		}
		if (isPrime)
		{
			printf("%lu is prime.\n", num);
		}
		printf("Please enter an integer for analysis; ");
		printf("Enter q to quit.\n");
	}
	printf("Bye.\n");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值