【Einführung in die Informatikolympiade】Einführung in Primzahlen

In der Mathematik ist eine Primzahl (Primzahl) eine Zahl, die nur durch 1 oder sich selbst teilbar ist. Daher verwenden Schüler beim Schreiben von Code häufig die folgenden Ideen, z. B. wie stellt man fest, dass 43 eine Primzahl ist? Teilen Sie dann 43 durch 2, 3, 4, 5 ... 42 und prüfen Sie, ob es eine Zahl gibt, die 43 von 2 bis 42 teilen kann. Wenn dies der Fall ist, ist 43 keine Primzahl, andernfalls ist 43 eine Primzahl . Somit kann der folgende Code geschrieben werden:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    int n;
    cin>>n;
    for(int i=2;i<n;i++){
    
    
		if(n%i==0){
    
    
			cout<<"合数";
			return 0;//是合数直接结束
		}
    }
    cout<<"质数";
	return 0;
}

Denken Sie darüber nach, wir brauchen Gewalt von 2 zu n-1, es ist zu langsam, wie kann man es optimieren?
Berechnen Sie von Hand und
Fügen Sie hier eine Bildbeschreibung ein
überlegen Sie, wie viel kann geteilt werden?
a/b=c...k, wenn a nicht durch b teilbar ist, dann ist a nicht durch c teilbar.
Wir haben festgestellt, dass es ausreicht, die arithmetische Quadratwurzel von n, also sqrt(n), zu dividieren, also optimieren Sie den Satz
for(int i=2;i<n;i++) for(int i=2;i<sqrt (n) ;i++) Also, mit:


#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    int n;
    cin>>n;
    for(int i=2;i<sqrt(n);i++){
    
    
		if(n%i==0){
    
    
			cout<<"合数";
			return 0;
		}
    }
    cout<<"质数";
	return 0;
}

In for wird jedoch die Quadratwurzeloperation für jeden Zyklus durchgeführt, was offensichtlich umständlich ist. Daher wird sqrt (n) vorgeschlagen und die Operation k = sqrt (n) für for abgeschlossen.
Also, mit:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    int n;
    cin>>n;
    int k=sqrt(n);
    for(int i=2;i<k;i++){
    
    
		if(n%i==0){
    
    
			cout<<"合数";
			return 0;
		}
    }
    cout<<"质数";
	return 0;
}

Die obige Schreibmethode wird hauptsächlich in Xingxinaozhong verwendet.
Es gibt eine andere Schreibweise, oft in ACM:

for(int i=2;i<=n/i;i++)

Fall 1: Finden Sie alle Primzahlen innerhalb von 100

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
    for(int i=2;i<=100;i++){
    
    
		int k=sqrt(i);
		int flag=0;
		for(int j=2;j<=k;j++){
    
    
			if(i%j==0){
    
    
			    flag=1;
			    break;
			}
		}
		if(flag==0){
    
    
			 cout<<i<<" ";
		}
		else flag=0;
	}
   
	return 0;
}

Fall2: Finden Sie alle Primzahlen zwischen n~m

#include<bits/stdc++.h>
using namespace std;

int main()
{
    
    
	int n,m;
	cin>>n>>m;
	if(n<2) n=2;
    for(int i=n;i<=m;i++){
    
    
		int k=sqrt(i);
		int flag=0;
		for(int j=2;j<=k;j++){
    
    
			if(i%j==0){
    
    
			    flag=1;
			    break;
			}
		}
		if(flag==0){
    
    
			 cout<<i<<" ";
		}
		else flag=0;
	}
   
	return 0;
}

Ich denke du magst

Origin blog.csdn.net/ciflame/article/details/130759066
Empfohlen
Rangfolge