题解:How many prime numbers(Miller-Rabin测试算法模板32位内素数检查)

该博客主要介绍如何使用Miller-Rabin测试算法来检查32位正整数中的素数数量。通过输入的案例,程序需要找出每个案例中素数的个数,例如在样例输入2 3 4中,输出为2,表示有两个素数(2和3)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Give you a lot of positive integers, just to find out how many prime numbers there are.
Input
There are a lot of cases. In each case, there is an integer N representing the number of integers to find. Each integer won’t exceed 32-bit signed integer, and each of them won’t be less than 2.
Output
For each case, print the number of prime numbers you have found out.
Sample Input
3
2 3 4
Sample Output
2

在这里插入图片描述

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long quickpow(long long a,long long b,long long m)
{
 long long c=1;
 while(b)
 {
  if(b%2) c=(c*a)%m;
  a=(a*a)%m;
  b/=2;	
 }
 return c;	
}
bool Miller_Rabin(long long x,long long n)//选取x为底,判定n是否可能为素数
{
 long long y=n-1;
 while(!(y&1)) y>>=1;
 x=quickpow(x,y,n);//略去n-1(=d*2^s)右端连续的0,将其调整为d
 while(y<n-1&&x!=1&&x!=n-1)//x=x^d mod n
  x=(x*x)%n,y<<=(long long )1;//将x反复平方,直到模数值出现n-1或1为止
 return x==n-1||y&1==1; //若x为n-1或y为奇数,则n可能为素数,否则一定不是
}
bool sushu(long long n)
{
 if(n==2||n==7||n==61) return 1;
 if(n==1||!(n%2)) return 0;
 return Miller_Rabin(2,n)&&Miller_Rabin(7,n)&&	Miller_Rabin(61,n);	
}
int main()
{
	long long n,tmp,sum;
	while(cin>>n)
	{
		sum=0;
		while(n--)
		{
			cin>>tmp;
			if(sushu(tmp))
			 sum++;
		}
		cout<<sum<<endl;
	}
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值