求素数的方法(判断数n)
1.从2到n-1的整数,依次判断n能否与之相除,若都不能就是素数
2.一个数如果有因子,那么在他的平方数以内就会有,否则就没有因子,(即为素数)。
3.筛选。先存入一定范围内的数,留下2去除2的倍数,留下3,去除3的倍数…。
int sushu(int n)//是素数返回1
{
int flag=1;
for(int i=2;i<=n-1;i++)
{
if(n%i==0)
{
flag=0;
}
}
return flag;
}
int sushu(int n)//是素数返回1
{
int flag=1;
for(int i=2;i<sqrt(n);i++)
{
if(n%i==0)
{
flag=0;
}
}
return flag;
}
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
vector<int> prime(10000, 1);
for(int i=2; i<100; i++){
if(prime[i]){
for(int j=i; i*j<10000; j++)
prime[i*j] = 0;
}
}
for(int k; cin>>k && k>1 && k<10000; )
cout << k << " is " << (prime[k] ? "":"not ") << "a prime." << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
bool valid[maxn];
void getPrime(int n,int &tot,int ans[maxn])
{
//N 要查找素数的范围;
//tot 素数数量总和;
//ans 素数表;
tot=0;
int i,j;
for(i=2; i<=n; i++) //将要查找素数fanwei内的valid全部赋值为true;
valid[i]=true;
for(i=2; i<=n; i++)
{
if(valid[i])
{
if(n/i<i)
break;
for(j=i*i; j<=n; j+=i) //将不是素数的数所对应的valid[i]赋值为false;
valid[j]=false;
}
for(i=2; i<=n; i++) //将[2,n]范围内的所有素数存入ans数组中;
if(valid[i])
ans[tot++]=i;
}
}
int main()
{
int n,tot;
int ans[100000];
tot=0;
cin>>n;
getPrime(n,tot,ans);
cout<<tot<<endl;
for(int i=0;i<tot;i++)
cout<<ans[i]<<" ";
return 0;
}
不用临时变量交换的方法
1.异或运算符^
int &swap(int &a, int &b)
{
return (b ^= a ^= b ^= a);
}
void swap(int *p, int *q)
{
*p = *p + *q - (*q = *p);
}
HDU3823
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <memory.h>
/*选用20000000是因为测试数据大概在这个范围*/
const int MAX_VALUE = 2e7;
static int primes[MAX_VALUE];
static char is_prime[MAX_VALUE+1];
/*初始化一个素数表用于查询
返回数量
质数定义:在大于1的自然数中,除了1和它本身以外不再有其他因数
*/
int createPrimeTable()
{
int size = 0;
/*初始化为1*/
memset(is_prime, 1, sizeof(is_prime));
/*计算开方值*/
/*
开根号法:对大于2的数N求平方根得到S,如果N能被2-S之间的数整除,那么N不是质数
*/
int s = sqrt((double)MAX_VALUE) + 1;
/*素数的计算
双重循环:2,3,4,5...s
2,3,4,5...M/i
上下依次相乘,计算出所有结合
*/
for (int i = 2; i <= s; i++) {
if (is_prime[i]) {
/*求出最大值*/
for (int j = 2; j <= MAX_VALUE / i; j++) {
is_prime[i * j] = 0;
}
}
}
/*剩下的就是质数*/
for (int i = 2 ; i <= MAX_VALUE; i++)
if (is_prime[i])
primes[size++] = i;
/*0和1不是质数*/
is_prime[0] = is_prime[1] = 0;
return size;
}
int main()
{
int count;
scanf("%d", &count);
/*初始化素数表*/
int size = createPrimeTable();
int case_number = 1;
while (count--)
{
int a, b;
/*输入a和b*/
scanf("%d%d", &a, &b);
/*调整顺序*/
if (a > b) {
/*比较酷的方式,不用临时变量*/
a = a ^ b; b = a ^ b; a = a ^ b;
};
int prime = -1;
for (int i = 0; i < size - 1; i++)
{
/*保证a和b之间只有一个素数*/
if (primes[i] >= a && primes[i + 1] >= b)
{
/*如果恰好相等*/
if ((primes[i] - a) == (primes[i + 1] - b))
{
/*输出*/
prime = primes[i] - a;
break;
}
}
}
printf("Case %d: %d\n", case_number++, prime);
}
return 0;
}