判断一个数是否为素数

博客介绍了素数的概念,提供了一种C语言代码实现判断并打印100到200之间的素数,通过试除法优化到只检查到平方根,进一步提升效率。最后代码优化只遍历奇数,显著提高了运行速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先可以了解什么是素数,并如何判断呢?

1,素数就是质素,只能被1和它本身整除的数字。

2,如果要判断i是否为素数,那2~i-1的数字去试除。

3,如果i被整除,就说明i不是素数。

4,如果2~i-1之间的数字都不能整除i,说明i是素数。


下面介绍一种试除法来判断一个数是否为素数,并打印。

题目:输出100~200之间的素数

#include<stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int flag = 1;//假设i为素数
		int j = 0;
		//判断i是否为素数
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;//被整除,说明i不是素数
				break;
			}
		}
		if (1==flag)//如果可执行,说明i是素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

       还可以对代码进行优化,提高程序运行效率,将第10行代码的for语句中的 i 改写成sqrt(i)

效果如下图所示。

	for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;//被整除,说明i不是素数
				break;
			}
		}
for (j = 2; j <=sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;//被整除,说明i不是素数
				break;
			}
		}

       为什么呢?如果m=a*b,则a和b中至少有一个数是小于等于根号m的,例如16=2*8,16=4*4

所以得出一个结论:如果(2~√m)之间有一个因子能整除m,一定会有另外一个因子能整除m

如果√m之前没有因子能整除m,之后没有能整除m的因子了,则(2~√m)之间没有能整除m的因子,

即为m为素数。

       其实我们还知道偶数不是素数,所以可以将第5行代码进行优化,判断奇数是否为质数即可。源头形式上少了一半数据,效率又能提高。

for (i = 101; i <= 200; i+=2)

        最后优化后的代码如下图所示(别忘了引用头文件#include<math.h>)

#include<stdio.h>
#include<math.h>
int main()
{
	int i = 0;
	for (i = 101; i <= 200; i+=2)
	{
		int flag = 1;//假设i为素数
		int j = 0;
		//判断i是否为素数
		for (j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;//被整除,说明i不是素数
				break;
			}
		}
		if (1 == flag)//如果可执行,说明i是素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

       以上简单介绍了什么是素数,并且如何用代码判断和打印素数,最后如何优化代码来提高运行效率。

       希望对读者有所帮助,也可以指出不足之处,共同进步。

<think>我们将编写一个C语言判断一个是否为质。质素数)的定义:在大于1的自然中,除了1和它本身以外不再有其他因。注意:1不是质。方法:遍历从2到sqrt(n)之间的所有整,检查是否能整除n。如果找到任何一个可以整除n的,则n不是质;否则,n是质。优化:先处理小于2的(不是质),然后处理2(是质),然后检查偶(除了2以外的偶都不是质),最后只检查奇因子。</think>### C语言实现质判断 以下是判断一个是否为质的C语言实现,包含详细注释和优化: ```c #include <stdio.h> #include <stdbool.h> // 使用布尔类型 #include <math.h> // 使用sqrt函 // 判断的函 bool is_prime(int num) { // 处理小于2的非质情况 if (num < 2) { return false; } // 单独处理2(唯一的偶质) if (num == 2) { return true; } // 排除所有偶(除2外) if (num % 2 == 0) { return false; } // 只需检查到平方根即可 int limit = (int)sqrt(num) + 1; // 只检查奇因子(从3开始,步进2) for (int i = 3; i <= limit; i += 2) { if (num % i == 0) { return false; } } return true; } int main() { int number; printf("请输入一个正整: "); scanf("%d", &number); if (is_prime(number)) { printf("%d 是质\n", number); } else { printf("%d 不是质\n", number); } return 0; } ``` ### 代码解释与优化策略: 1. **边界条件处理**: - 小于2的都不是质(包括负) - 2是唯一的偶质,单独处理 2. **偶优化**: - 除2外所有偶都不是质,直接排除 - 减少50%的检查量 3. **平方根优化**: - 使用`sqrt(num)`作为检查上限 - 学原理:若n有因子d,则必有n/d,且其中一个≤√n - 大幅减少循环次(从O(n)到O(√n)) 4. **奇因子检查**: - 跳过所有偶因子(已排除偶质) - 步进值设为2(i += 2),减少50%循环次 5. **效率对比**: - 检查1亿:原始方法需1亿次循环 - 优化后仅需约5000次(√1亿 = 1万,再减半) ### 测试用例示例: ```c // 测试函 void test_primes() { int test_cases[] = {-1, 0, 1, 2, 3, 4, 17, 100, 7919}; int size = sizeof(test_cases) / sizeof(test_cases[0]); for (int i = 0; i < size; i++) { int num = test_cases[i]; printf("%5d -> %s\n", num, is_prime(num) ? "质" : "非质"); } } /* 输出: -1 -> 非质 0 -> 非质 1 -> 非质 2 -> 质 3 -> 质 4 -> 非质 17 -> 质 100 -> 非质 7919 -> 质(第1000个质) */ ``` ### 进一步优化(埃拉托斯特尼筛法预存): ```c // 适合需要多次判断的场景 #define MAX_LIMIT 10000 bool primes[MAX_LIMIT] = {false}; void precompute_primes() { primes[2] = true; for (int i = 3; i < MAX_LIMIT; i += 2) { primes[i] = true; // 假设所有奇为质 } for (int i = 3; i * i < MAX_LIMIT; i += 2) { if (primes[i]) { for (int j = i * i; j < MAX_LIMIT; j += i * 2) { primes[j] = false; // 标记倍 } } } } // 使用时直接查询primes组 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值