1.1求素数暴力枚举 HDU3823(不用临时变量交换两数)

求素数的方法(判断数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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43870649/article/details/88749243