首页 > 其他分享 >素数

素数

时间:2024-05-11 17:52:27浏览次数:9  
标签:nums int 合数 ++ 素数 size

定义

  素数又称作质数,是大于 1 且只能被 1 和 本身 整除的整数

  合数是大于 1 且 不是 素数的数。

算法

第一种(判断)

  通过定义及数学上的原理,判断出素数,为什么到sqrt(x),因为如果x是合数,它
拆分的两个因数一个 >= sqrt(x),一个<= sqrt(x),所以较小的因数的最大可能值就是sqrt(x)。

实现

bool isPrime(int x) {  
    bool prime = true;  
    if (x < 2) {  
        prime = false;  
    } else  
        for (int i = 2; i <= sqrt(x); i++) {  
            if (x % i == 0) {  
                prime = false;  
                break;  
            }        
        }    
        return prime;  
}

第二种(选择)

  利用素数表进行,通过它作为除数,对其他数进行整除判断。

原理

  任何一个合数都可以分解为一个素数与另一个整数的乘积。 所以只要整数可以被(除自己以外)素数整除,必然是合数。

  证明一下:对于任意一个合数n,它可以被分解为两个整数的乘积。分为两种情况:

  1. 俩都是合数
  2. 其中一个是素数

  对于第二种情况,自然满足命题;

  那么对于第一种情况,任取一个合数,又可以分解为两个因数,重复此步骤,要么存在素数,要么都是合数,每一次分解数的值在缩小,最后会要么得到素数,要么得到最小的合数4。而4可以分解成2 * 2,得到素数,自然命题成立。

实现


void selectSimple(int x) {  
  
    /* 初设几个素数 */    
    nums[0] = 2;  
    nums[1] = 3;  
	int count = 2;
	
    if (x <= 1) {  
        count = 0;  
    } else if (x == 2 || x == 3) {  
        count = x - 1;  
    } else  
        for (int i = 4; i <= x; i++) {
	          /* 利用素数表判断 */
            for (int j = 0; j < count; j++) {  
                if (i % nums[j] == 0) {  
                    break;  
                }  
                /* 将素数加入素数表中 */                
                if (j == count - 1) {  
                    nums[count] = i;  
                    count++;  
                }
                            
            }        
        }  
        
    for (int i = 0; i < count; i++) {  
        std::cout << nums[i] << ' ';  
    }
}



第三种(选择)

  前面介绍的基本是通过定义进行判断,现在介绍一种思想,排除筛查,就是通过已找出的素数(它们的倍数一定不是素数),排除一定范围内的合数,剩下的就是素数。

实现


/*收集0 ~ nums.size() - 1中的素数*/
void selectPrime(vector<int> &nums){  
    /*假定都是素数*/
    for (int i = 0; i < nums.size(); i++) {  
        nums[i] = 1;  
    }    
    /*最小的素数2*/
    for (int i = 2; i < nums.size(); i++) {  
        if (nums[i] == 1) {  
	        /*从 i*i 开始,因为之前的素数将0 ~ i*i 的合数排除了*/
            for (int j = i*i; j < nums.size(); j += i){  
                nums[j] = 0;  
            }
        }    
    }  
}

	/* 输出素数 */
	for (int i = 2; i < nums.size(); i++){
		if (nums[i] == 1) {
			cout << i << ' ';
		}
	}

标签:nums,int,合数,++,素数,size
From: https://www.cnblogs.com/import-this05/p/18186948

相关文章

  • java 两个列表的元素是否相等且各自元素数量相等
    示例如下:importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){List<String>list1=Arrays.asList("深圳攀峰运","深圳攀峰运","广州博纳德","广州博纳德","广州博纳德","广州博纳德");......
  • P3383 【模板】线性筛素数
    原题链接题解关键因素:任何合数都可以分为最小质数乘上另外一个数code#include<bits/stdc++.h>usingnamespacestd;vector<int>ans;intmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);intn;cin>>n;vector<int>vis(n+5,0);......
  • 2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2, 分别移除它们各自的一
    2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2,分别移除它们各自的一半元素,将剩下的元素合并成集合s。找出集合s中可能包含的最多元素数量。输入:nums1=[1,2,3,4,5,6],nums2=[2,3,2,3,2,3]。输出:5。答案2024-05-01:chatgpt题目来自leetcode3002。大体......
  • 1013 数素数
    #include<bits/stdc++.h>usingnamespacestd;boolisPrime(intx){ if(x==1)returnfalse; for(inti=2;i<=sqrt(x);i++){ if(x%i==0)returnfalse; } returntrue;}intmain(){ inta,b; cin>>a>>b; //第5个素数和第27个素数 intcount=0; ......
  • 6-2 计算素数和
    本题要求计算输入两个正整数x,y(x<=y,包括x,y)素数和。函数isPrime用以判断一个数是否素数,primeSum函数返回素数和。输入格式:输入两个整数。输出格式:[m-n]间的素数和裁判测试程序样例: /*请在这里填写答案*/x,y=map(int,input().split())print(primeSum(x,y))......
  • 洛谷题单指南-数学基础问题-P1835 素数密度
    原题链接:https://www.luogu.com.cn/problem/P1835题意解读:要计算L-R范围内素数的个数。解题思路:直接对L~R的每个数判断素数肯定不可取,因为L、R的范围较大。既然要计算素数的个数,那么可以把其中的合数标记出来即可。如何标记合数?可以借助于筛素数的算法思想,枚举每一个素数,然......
  • 信息学奥赛一本通:1403:素数对
    【题目描述】两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。【输入】一个正整数n(1≤n≤10000)。【输出】所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。【输入样例】......
  • 洛谷题单指南-数学基础问题-P3383 【模板】线性筛素数
    原题链接:https://www.luogu.com.cn/problem/P3383题意解读:素数筛模版题。解题思路:素数筛介绍所谓素数(质数),是指除了1和它本身以外不再有其他因数的自然数,一般用试除法判断素数(时间复杂度:O(sqrt(n))):boolisprime(intx){if(x<=1)returnfalse;for(inti=2;i*......
  • 洛谷B3840 [GESP202306 二级] 找素数
    这道题让我们找A 和 B 之间(包括 A 和 B)有多少个素数。#include<bits/stdc++.h>usingnamespacestd;boolisprime(intn){if(n==0||n==1)returnfalse;for(inti=2;i*i<=n;i++){if(n%i==0)returnfalse;}returntrue;}intmain(){......
  • 实验4-1-5 统计素数并求和
    本题要求统计给定整数M和N区间内素数的个数并对它们求和。输入格式:输入在一行中给出两个正整数M和N(1≤M≤N≤500)。输出格式:在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。输入样例:1031输出样例:7143#include<stdio.h>intmain(){i......