A la recherche de nombres premiers - Méthode de dépistage prime comprenant

En fait, le tamis premier peut être considéré comme un moyen relativement simple, mais je l' avais toujours été avec une partie de leur propre code de compréhension et de l' écriture, et a décidé d' en apprendre davantage sur le système.
En général, on détermine si un nombre est un nombre premier, ce nombre est généralement regarder sauf 1 et lui - même est de savoir s'il y a des facteurs, le code de base est la suivante

int n,i;
scanf("%d",&n);
for(i=2;i<n;i++){
	if(n%i==0)break;
}
if(i>=n)printf("ture");

Bien sûr, cette méthode de détermination est nettement plus, pas complètement de 2 à n-1 est déterminé, en effet, si le nombre non-prime a = i * j; i <= j, il est clair que depuis un grand nombre s'il y a un facteur qui il faut aussi un petit facteur, et petit facteur i <= sqrt (a), de sorte que, tant que énuméré de 2 à sqrt (a) sur la ligne. Code est la suivante:

int n,i,x;
scanf("%d",&n);
x=(int)sqrt(n);
for(i=2;i<=x;i++){
	if(n%i==0)break;
}
if(i>=n)printf("ture");

En fait, si vous jugez des chiffres plus prime, alors vous fait juste frapper la table sur la ligne. Qu'est-ce qu'une table de jeu, vous devez d'abord le jeu est une table de choix, seulement après chaque fois que vous vérifiez dans le tableau, il est pas un nombre premier sur elle. Alors que l'approche de la table de jeu est la suivante: Au début, tous les chiffres que vous shilling est un nombre premier, puis éliminer le nombre non-prime des nombres premiers de la table: méthodes, consultez le code suivant

#include<cstdio>
#include<cstring>
bool Pri[100010];       //一般这么大够了,代表从1筛到100000
void prime(){
	memset(Pri,0,sizeof(Pri));
	int i,j;
	Pri[1]=1;           //1不是素数 
	for(i=2;i*i<=100000;i++){        //2到100000的非素数必然含有2到sqrt(i)的因子 
		if(Pri[i]==0){
			for(j=i*i;j<=100000;j+=i){    //因为如果j=i*p,p<i开始,实际上以p为因子的非素数已经被筛了一次 ,不用再筛了 
				Pri[j]=1;
			}
		}
	}
}
int main()
{
	prime();
	int n;
	while((scanf("%d",&n))>=1){          //不同题目要求结束方式不一样 
		if(Pri[n]==0)printf("ture\n");
		else printf("false\n");
	}
	return 0;
} 

当然,理解本质是最重要的,下面有一道题:
Pour améliorer l'organisation de sa ferme, agriculteur John étiquettes chacune de ses vaches N (1 <= N <= 5.000) avec un numéro de série distinct dans la gamme 1 ... 20 000 . Malheureusement, il ne sait pas que les vaches interprètent des numéros de série mieux que d' autres. En particulier, une vache dont le numéro de série a le premier facteur le plus élevé jouit du statut social plus élevé parmi toutes les autres vaches.

(On rappelle qu'un nombre premier est juste un nombre qui n'a pas de diviseurs à l'exception de 1 et elle-même. Le numéro 7 est premier alors que le nombre 6, étant divisible par 2 et 3, est pas).

Etant donné un ensemble de N (1 <= N <= 5.000) des numéros de série dans la plage de 1 ... 20000, déterminer celui qui a le plus grand facteur premier.
Contribution

  • Ligne 1: un entier, N

  • Les lignes 2 ... N + 1: Les numéros de série à tester, une par ligne de
    sortie

  • . 1 ligne :. Le plus grand de l'entier avec le cas il y a le facteur premier au cours des Plus Un, une sortie plus tôt en ce que le Apparait Le fichier d'entrée.
    L'échantillon de l'entrée
    . 4
    36
    38 est
    40
    42 est
    l'échantillon de la sortie
    38 est
    commanditaire
    objet de plusieurs moyens de haut qui cherchent le nombre de le nombre maximum de facteurs premiers, en fait, peut être utilisé pour jouer la table pour faire, comment le faire: d'
    abord, la table moyenne d' origine: nombre premier est 0, un nombre non-prime est 1.
    et maintenant, nombres premiers lui - même, nombre non premier est le plus grand facteur premier.
    Donc , de 2 pour trouver un nombre premier, il a été à la hauteur, à la recherche de ses multiples, et le facteur premier de ses multiples sera remis à ce nombre premier, parce que nous si traversée, le premier retour doit être supérieur au nombre premier précédent, de sorte que vous pouvez affecter directement . Un autre point, ce tableau devrait se rappeler les nombres premiers fixés pour eux - mêmes, et la boucle intérieure ne peut pas démarrer à partir du i * i, et je veux commencer, en raison du plus grand nombre de qualité derrière tout cela.
    Code est la suivante:

#include<cstdio>
#include<cstring> 
int maxpri[20010];
void maxp()
{
	int i,j;
	memset(maxpri,0,sizeof(maxpri));
	maxpri[1]=1;
	for(i=2;i<=20005;i++){
		if(maxpri[i]==0){
			for(j=i;j<=20005;j+=i){
				maxpri[j]=i;            //不断替换,由素数找倍数,后面素数大于前面的 
			}
		}
	}
}
int main()
{
	maxp();
	int n,i,p,tprim;
	while((scanf("%d",&n))>0){            //输入n,代表接下来输入n个数 
	int max=0,how=0;
	for(i=0;i<n;i++){
		scanf("%d",&p);        //输入这n个数 
		tprim=maxpri[p];       //取最大素数 
		if(tprim>max){
			max=tprim;         //保存最大素数 
			how=p;             //保存含最大素因子的数 
		}
	}
	printf("%d\n",how);
}
	return 0;
}
Publié 14 articles originaux · louange gagné 16 · vues 1285

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45981189/article/details/104978324
conseillé
Classement