素数判定C语言与python

本文详细讲解了如何使用C语言和Python判断一个大于3的数是否为素数,通过举例和代码实现,对比两种语言的素数检查技巧,并省略了类型转换。特别介绍了Python的简洁for-else结构。

题目:

  • 对任意一个大于3的数,判断它是否是素数

分析:

  • (1) 素数:除了1和本身,不能被任何其他数整除
  • (2) 假设数字是 n, 只用检测是否被 2 ~ n/2 整除即可(甚至是只需要判断到 2~根号n)。

C语言解题

  • 第四步写起来还是比较乱的,要判断定 3,4,5 这几个小的数字。仅个人思路写法
  • 并且要注意类型转换 (int)n/2
#include<stdio.h>

// 素数判定

int main()
{
	// 1.获取n的值
	int n, i;
	printf("请输入n的值:\n");
	scanf("%d", &n);
	// 2. 创建 作为初始除数i=2
	for(i=2;i <= n/2; i++)
	{
		// 3. 判断 2~ n/2 的是能否整除,能整除就得出 不是素数,结束循环
		if (n%i == 0)
		{
			printf("%d, 不是素数\n", n);
			break;
		}
	}
	// 4. 当i>= n/2时,表示循环全部结束,输出n是素数(这里 i > n/2 的情况是 n==3,i=1,且 n 不能为4,因为是四,两个printf语句都将输出) 
	if (i >= (int)n/2 && n != 4)
		printf("%d, 是素数\n", n);
	return 0;
}
  • 补充:实际上不需要类型转换
    在这里插入图片描述

python解题

  • python for 语句后面固有的 else语法, 是省去了C语言最后面的 if判断,简洁了一点
n = int(input("请输入要判定的数字:"))
for i in range(2, int(n/2) + 1):
    if n%i == 0:
        print("%d, 不是素数"% n)
        break
# 此else 与for对齐
else:
    print("%d, 是素数"% n)
<think>好的,用户想找关于素数判定的在线评测题目或练习题。首先,我需要回忆常见的OJ平台有哪些,比如LeetCode、牛客网、洛谷等,这些平台通常会有素数相关的题目。然后,要确保这些平台确实有相关题目,可能需要通过引用中的内容来支持,但用户的引用里提到的华为OD机试、C语言OJ题、内大OJ练习题等,可能没有直接提到素数题目,不过可以推测这些平台可能有相关题目。 接下来,我需要列出具体的题目例子,比如判断是否为素数、区间内素数个数、特定形式的素数等,这些都是常见的题型。同时,用户可能需要了解如何高效判断素数,比如埃拉托斯特尼筛法,或者处理大数时的优化方法,比如米勒-拉宾测试。这些算法通常在OJ题中会用到。 然后,要考虑用户可能的水平,如果是初学者,可能需要推荐基础题目,而进阶用户可能需要更复杂的题目。因此,需要分层次推荐。同时,结合引用中的内容,比如华为OD机试的题目可能更偏向算法应用,可以建议用户关注该专栏获取最新题目。 另外,用户提到的在线评测系统可能需要具体的平台链接或名称,但根据引用内容,可能无法直接提供外部链接,因此需要建议用户到知名OJ平台搜索相关题目。同时,注意使用中文回答,保持结构清晰,分点说明,并添加相关问题供用户进一步学习。 最后,确保所有数学表达式使用正确的LaTeX格式,如$n$,筛法的时间复杂度$O(n \log \log n)$等,并检查是否有引用需要标注,比如引用中的华为OD机试可以作为参考资源。</think>### 素数判定的在线评测题目及练习指南 #### 常见OJ平台及题目推荐 1. **华为OD机试题库** 包含算法题和编程题,涉及素数判定的变种题目,例如: - 判断区间内素数的个数 - 满足特定条件的素数组合(如素数对、回文素数) 建议关注[华为OD机试E卷目录](^1)获取最新题目。 2. **C语言OJ练习题** 适合基础训练,例如: - 输入一个整数,判断是否为素数 - 输出前$n$个素数 参考代码模板类似冒泡排序的循环结构[^2],但需修改核心逻辑为素数判定。 3. **内大OJ练习题** 包含循环控制条件判断的综合应用,例如: - 筛选区间$[a,b]$内的素数并统计数量 - 计算素数的特殊性质(如素数和、最大间隔) #### 典型题目类型 1. **基础题** - **题目**:输入整数$n$,判断其是否为素数 **示例输入**:`17` **示例输出**:`Yes` **核心逻辑**:遍历$2$到$\sqrt{n}$,若存在能整除的数则非素数。 2. **中等题** - **题目**:输出区间$[L,R]$内所有素数的和 **示例输入**:`10 20` **示例输出**:`60`(对应素数11+13+17+19) **优化方法**:使用筛法(如埃拉托斯特尼筛)预处理。 3. **进阶题** - **题目**:判断大数$n$(如$n \leq 10^{18}$)是否为素数 **解决方法**:使用**米勒-拉宾素性测试**(概率算法)或确定性算法优化。 #### 实现示例(Python) ```python # 基础素数判定 def is_prime(n): if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True # 筛法求区间素数 def sieve(l, r): is_prime = [True] * (r + 1) is_prime[0] = is_prime[1] = False for i in range(2, int(r**0.5) + 1): if is_prime[i]: for j in range(i*i, r+1, i): is_prime[j] = False return [x for x in range(l, r+1) if is_prime[x]] ``` #### 性能优化技巧 - **筛法时间复杂度**:埃拉托斯特尼筛为$O(n \log \log n)$,适合预处理[^3]。 - **大数判定**:米勒-拉宾测试通过多次随机选择基数降低误判率。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值