专栏文章

10.26-东塘404-J1R(2):埃氏筛

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mineskoy
此快照首次捕获于
2025/12/02 01:14
3 个月前
此快照最后确认于
2025/12/02 01:14
3 个月前
查看原文

新知识

CPP
//埃氏筛:
//标记当前数是合数(1)/质数(0)
//默认一开始所有数都是指数
bool isp[100000010];
void ashpick(int n){  //筛出1~n之间的所有数
  isp[0]=isp[1]=1;  //0和1都不是质数
  for(int i=1;i<=n;i++){
    if(isp[i]==0){  //找到一个质数i
      for(int j=i*2;j<=n;j+=i){  //拿i去筛掉他的所有倍数
        isp[j]=1;  //标记成不是质数
      }
    } 
  } 
} 

P8754 [蓝桥杯 2021 省 AB2] 完全平方数

思路

先定义个n变量,要开long long,在输入n,然后定个x=1,来存最小的正整数,再来一个for循环:
CPP
for(int i=2;i<=n/i;i++){
  int cnt=0;
  while(n%i==0){
    cnt++;
    n/=i;
  }
  if(cnt%2==1){
    x*=i;		
  }
}
然后来个if判断:if(n>1)x*=n; 最后输出x。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
	cin>>n;
	long long x=1;
	for(int i=2;i<=n/i;i++){
		int cnt=0;
 		while(n%i==0){
    		cnt++;
   			n/=i;
  		}
  		if(cnt%2==1){
		  	x*=i;		
		}
	}
	if(n>1)x*=n;
	cout<<x;
	return 0;
} 

P10495 阶乘分解

思路

先顶一个变量和一个数组:n,cnt[1000010];然后输入n,最后来两个for循环:
CPP
for(int xx=1;xx<=n;xx++){
	int x=xx;
	for(int i=2;i<=x/i;i++){
	 	while(x%i==0){
	 		cnt[i]++;
	   		x/=i;
		}
	}
	if(x>1)cnt[x]++;
}
for(int i=1;i<=1000000;i++){
	if(cnt[i]){
		cout<<i<<' '<<cnt[i]<<endl;
	}
}

代码

CPP
#include<bits/stdc++.h>
using namespace std;
long long n,cnt[1000010];
int main(){
	cin>>n;
    for(int xx=1;xx<=n;xx++){
    	int x=xx;
    	for(int i=2;i<=x/i;i++){
    	 	while(x%i==0){
    	 		cnt[i]++;
    	   		x/=i;
    		}
    	}
    	if(x>1)cnt[x]++;
    }
    for(int i=1;i<=1000000;i++){
    	if(cnt[i]){
    		cout<<i<<' '<<cnt[i]<<endl;
    	}
    }
	return 0;	
}

B4170 [BCSP-X 2024 6 月小学高年级组] 最小质因子

思路

先定一个判断质数因数的函数:is_prime(),在创建一个t,然后关闭同步流,最后来个while循环:
CPP
while(t--){
    	long long n;
		cin>>n;
		if(is_prime(n)){
			cout<<n<<endl;
			continue;
		}
		for(long long i=2;i<=n/i;i++){
			if(n%i==0){
				cout<<i<<endl;
				break;
			}
		}
	}

代码

CPP
#include<bits/stdc++.h>
using namespace std;
long long is_prime(long long n){
  if(n<=1){
    return 0;
  }
  for(long long i=2;i<=n/i;i++){
    if(n%i==0){
      return 0;
    }
  }
  return 1;
}
long long t; 
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
    	long long n;
		cin>>n;
		if(is_prime(n)){
			cout<<n<<endl;
			continue;
		}
		for(long long i=2;i<=n/i;i++){
			if(n%i==0){
				cout<<i<<endl;
				break;
			}
		}
	}
	return 0;
}

P3912 素数个数

先定义个埃氏筛函数,再定个n,输入n,再用埃氏筛函数(n),再定个 ans,然后来个for循环,最后输出ans;

代码

CPP
#include<bits/stdc++.h>
using namespace std;
bool isp[100000000];
void ashpick(int n){
  isp[0]=isp[1]=1;
  for(int i=2;i<=n;i++){
  	if(isp[i]==0){
  		for(int j=i*2;j<=n;j+=i){
  			isp[j]=1;
		}	
	}
  }
}
long long n;
int main(){
	cin>>n;
	ashpick(n);
	long long ans=0;
	for(int i=1;i<=n;i++){
		if(isp[i]==0)ans++;
	}
	cout<<ans;
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...