有(晒素数+枚举)

时间限制: 1 Sec  内存限制: 128 MB

题目描述

乌龟给自己的贵重物品上了密码锁。密码锁上有5个数字拨盘。每个数字拨盘每次向上拨使数字增加1(9向上拨得到0),向下拨使数字减少1(0向下拨得到9)。

拨盘上的数字组成一个5位数。只要拨盘上的数字变为素数,密码锁就会被解开。素数(又称质数)是只能被1和它自身整除的大于1的自然数。因为乌龟动作实在太慢,他希望你帮他计算如何开锁,使得拨动的总次数最少。
 

 

输入

一个5位数,表示拨盘的初始数字

 

输出

一个5位素数,表示开启密码锁使用的素数(拨动次数最少)。如有多组解,输出满足条件的最大数

 

样例输入

复制样例数据

01212

样例输出

01213

1.首先算出2~100000的所有素数。(随便你用什么算法,保证小于等于O(nlogn)就行) 2.其次枚举每一个素数,与原来的数的每一位比较,算出每一位至少要拨几次,然后算出最小的,等于的话,为最大的素数。。

PS:0拨到9有2中方法,分别为拨一次和拨9次,发现没有0-9+10=1,9-0=9; 再来,8拨到2有2中方法,分别为拨4次和拨6次,8-2=6,2-8+10=4; 知道了怎么求每一位的最小拨动次数了吧!

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#
在 C 语言中,**素数(质数)枚举**指的是找出一定范围内所有的素数素数的定义是:**大于 1 的自然数,除了 1 和它本身之外没有其他因数的数**。 --- ## ✅ 示例需求 编写一个 C 程序,**枚举从 2 到 N 的所有素数**。 --- ## 🧩 方法一:简单枚举法(暴力法) ```c #include <stdio.h> #include <stdbool.h> // 判断一个数是否为素数 bool is_prime(int n) { if (n < 2) return false; for (int i = 2; i * i <= n; i++) { if (n % i == 0) return false; } return true; } int main() { int N; printf("请输入上限 N: "); scanf("%d", &N); printf("从 2 到 %d 的素数有:\n", N); for (int i = 2; i <= N; i++) { if (is_prime(i)) { printf("%d ", i); } } printf("\n"); return 0; } ``` ### ✅ 输出示例: ``` 请输入上限 N: 20 从 2 到 20 的素数有: 2 3 5 7 11 13 17 19 ``` --- ## 🧩 方法二:埃拉托斯特尼筛法(Sieve of Eratosthenes) 这种方法效率更高,适合大范围的素数查找。 ```c #include <stdio.h> #include <stdbool.h> #include <string.h> void sieve_of_eratosthenes(int N) { bool is_prime[N + 1]; memset(is_prime, true, sizeof(is_prime)); for (int p = 2; p * p <= N; p++) { if (is_prime[p]) { for (int i = p * p; i <= N; i += p) is_prime[i] = false; } } printf("从 2 到 %d 的素数有:\n", N); for (int i = 2; i <= N; i++) { if (is_prime[i]) printf("%d ", i); } printf("\n"); } int main() { int N; printf("请输入上限 N: "); scanf("%d", &N); sieve_of_eratosthenes(N); return 0; } ``` --- ### ✅ 时间复杂度比较 | 方法 | 时间复杂度 | 说明 | |------|------------|------| | 暴力法 | O(n√n) | 简单易懂,但效率较低 | | 埃氏筛法 | O(n log log n) | 更高效,适合大范围查找 | --- ### ✅ 总结 | 方法 | 适用场景 | |------|----------| | 暴力法 | 小范围、教学、入门 | | 埃氏筛法 | 大范围、性能要求高 | ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值