刷题日记——非素数个数(厦大机试)

2024-03-17 08:52

本文主要是介绍刷题日记——非素数个数(厦大机试),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

在这里插入图片描述

分析

  • 使用欧拉筛法计算从1到b的素数个数,方法如下:
            找到一个素数后,就将它的倍数标记为合数,也就是把它的倍数“筛掉”;如果一个数没有被比它小的素数“筛掉”,那它就是素数。
  • 计算出从1到b的素数过后,会留下一个装满从1到b内所有素数的数组,该数组大小即为从1到b的素数个数 c o u n t b count_b countb,我们遍历数组,对小于a的素数个数进行计数,计数值即为1到a的素数个数 c o u n t a count_a counta
  • 那么从a到b的素数个数为: c o u n t b − c o u n t a count_b-count_a countbcounta
  • 从a到b的非素数个数为: b − a + 1 + c o u n t b − c o u n t a b-a+1+count_b-count_a ba+1+countbcounta(注意a≠1时成立)
  • 注意,题目要求1也算作素数,那么在a=1时,从a到b的非素数个数为: b − a + c o u n t b − c o u n t a b-a+count_b-count_a ba+countbcounta

代码

#include <cstdio>
#include <map>
#include <string>
#include <string.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <limits.h>
using namespace std;
bool is_su[10000001];
int su[10000001];int num_of_su(int n){int counts = 0;for(int i=2;i<=n;i++){if(is_su[i]){su[++counts] = i;}for(int j=1;j<=counts&&i*su[j]<=n;j++){is_su[i*su[j]] = false;if(i%su[j]==0){break;}}}return counts;
}int main(){int a,b;while(scanf("%d%d",&a,&b)!=EOF){int counts_a = 0;int counts_b = 0;memset(is_su, true, b+1);is_su[1]=false;counts_b = num_of_su(b);for(int i=1;su[i]<a;i++){counts_a++;}int result = b-a-counts_b+counts_a+1;if(a==1){result--;}printf("%d\n",result);}return 0;
}

到此结束,更多关于欧拉筛法的信息,请看下面的链接,当然还有其他的筛法我没有做。

【算法/数论】欧拉筛法详解:过程详述、正确性证明、复杂度证明
【【C++算法】20分钟学会高效地素数筛法,埃氏筛法,欧拉筛法】
一次找出范围内的所有素数,埃式筛法是什么神仙算法?

xmu机试题刷题结束

在这里插入图片描述

这篇关于刷题日记——非素数个数(厦大机试)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818464

相关文章

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

【中等】保研/考研408机试-二分查找(模板题)

二分查找就是在一个有序数组中查找某个值,以首端尾端的中点mid查找对比,mid与要查找的数进行对比,看落在哪个区间,在那个区间重新得到首端和尾端,进而得到新的mid值。 一、模板题 二分查找-I_牛客题霸_牛客网 class Solution {public:int search(vector<int>& nums, int target) {int left=0,right=nums.s

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8