[C언어] 어떤 숫자가 소수인지 판단하기(소수) 통념---상세한 설명(복습 필요)

소수의 정의(소수)

1보다 큰 자연수 중 1과 자신을 제외한 다른 자연수로 나누어 떨어지지 않는 质数(也叫素数)것을 합성수라고 하고, 그렇지 않으면 합성수라고 합니다. 0과 1은 소수도 합성도 아니며 가장 작은 소수는 2입니다.

소수를 판단하는 방법 (1)은 일반적으로 사용되지만 그다지 효율적이지 않습니다.

이 방법은 이해하기 쉽고 생각하기 쉽습니다.

그러나 이 방법은 그다지 효율적이지 않습니다.

//判断质数(素数)方法一 
#include <stdio.h> 
int main()
{
    
    
	int n,i;
	printf("请输入大于等于2的整数:");
	scanf("%d",&n);
	putchar('\n');
	
	if(n<2)
	{
    
    
		printf("%d不是质数(素数)!\n");
	}
	else{
    
    
		for(i=2;i<n;i++)
			{
    
    	
				if(n%i==0) //如果有大于2的可以除尽的数,则不是素数
					break; 
			}//注意这里的i是否被除尽,若除尽了,则通过break跳出for循环后直接通过下面的if判断(i<n)输出n不是素数
			//若除不尽,那么for循环中的break则执行不到,亦即整个for循环都执行了,直到i++ = n不符合循环条件时才跳出循环,执行下面的else 即打印n是素数
			printf("(i这时是:%d)\n\n",i); //测试  意为看看第一个不符合的(可以除尽的)数是多少? 
		
		if(i<n) //即 存在2~(n-1)之间有因数 
		{
    
    
			printf("%d不是素数(质数)!\n",n);
		}
		else 
			printf("%d是素数(质数)!\n",n); 
	}
	
	return 0;
}

테스트:
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
마찬가지로, 위의 숫자가 소수인지 처리하는 과정도 함수로 캡슐화할 수 있습니다. 즉, 동일합니다.

//将上述方法封装为函数Prime 
#include <stdio.h> 
int Prime(int n); //函数原型声明 
int main()
{
    
    
	int n;
	printf("请输入大于等于2的整数:");
	scanf("%d",&n);
	putchar('\n');
	
	Prime(n); //调用函数Prime来处理该数是不是素数 
		
	return 0;
}

int Prime(int n) //函数定义 
{
    
    
	int i;
	if(n<2)
	{
    
    
		printf("%d不是质数(素数)!\n");
	}
	else{
    
    
		for(i=2;i<n;i++)
			{
    
    	
				if(n%i==0) //如果有大于2的可以除尽的数,则不是素数
					break; 
			}
			printf("(i这时是:%d)\n\n",i); //测试  意为看看第一个不符合的(可以除尽的)数是多少? 
		
		if(i<n) //即 存在2~(n-1)之间有因数 
		{
    
    
			printf("%d不是素数(质数)!\n",n);
		}
		else 
			printf("%d是素数(质数)!\n",n); 
	}
	
}

그런 다음 다시 테스트합니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

소수를 판단하는 방법 (2) 수학 함수를 차용하는 것이 더 효율적입니다.

여기서 말하는 "수학적 함수의 차용"은 제곱근을 구하는 데만 사용되며, 핵심 아이디어는 수학 함수를 사용하여 소수를 찾는 것이 아니라는 것입니다.

사실 지금도 나머지를 취해서 판단하지만, 여기서 요구되는 판단의 횟수는 그리 많지 않다.

//判断素数方法二:求数n的 算术平方根p,并对<=p的所有数 取余看是否为0。
//若有为0的(即有除尽的),则数n不是素数,否则n是素数

#include <stdio.h>
#include <math.h>
int main()
{
    
    
	int n,i,k;
	printf("请输入大于等于2的整数:");
	scanf("%d",&n);
	
	putchar('\n');
	k=sqrt(n); //即对n开平方
	printf("对%d开平方后得到的k是:%d\n",n,k); //测试,看对n开方得到的k是多少 
	putchar('\n');
	
	for(i=2;i<=k;i++){
    
    
		if(n%i==0)
			break;
	}
	printf("(此时,i是%d)\n",i);//测试,亦为看看此时 第一个满足取余等于0 的因子是多少 
	
	putchar('\n');
	if(n<2)  //当输入的n小于2时,直接 输出 n不是 素数 
	{
    
    
		printf("%d不是素数!\n",n);
	}
	else if(i<=k){
    
    
		printf("%d不是素数!\n",n);
	}
	else{
    
    
		printf("%d是素数!\n",n);
	} 
	
	return 0;	
} 

테스트는 다음과 같습니다.

k는 정수를 정의하기 때문에 99를 제곱한 후 얻은 숫자 k는 9임을 알 수 있습니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

방법 1의 테스트와 같은 숫자를 골랐는데 테스트 결과는 똑같았다. 따라서 이 방법도 맞습니다. 어떤 방법을 선택할지는 독자가 어떻게 생각하느냐에 달려 있습니다.

그렇다면 두 번째 방법은 나머지를 취할 때 왜 그렇게 여러 번 판단하지 않아도 될까요? 즉, i가 k보다 작거나 같을 때 숫자 n이 소수인지 여부를 결정할 수 있는 이유는 무엇입니까? 다음과 같이 생각하십시오. 숫자 n을 판단할 때 不是素数k보다 작거나 같은 숫자 i가 있고 n을 균등하게 나눌 수 있는 숫자가 있으면 n은 확실히 소수가 아닙니다. (소수의 약수는 1과 자기 자신이기 때문에!)

n이 소수라고 판단하는 것에 관해서는 이렇게 생각하십시오. 소수의 반대는 合数예를 들어 4는 합성수입니다(1과 그 자신 외에 다른 요인이 있으므로 이 숫자를 합성수라고 합니다. 숫자).

숫자 n에 대해 n=a*b로 분해될 수 있다면 a와 b 중 하나는 n보다 크거나 같아야 하고 다른 하나는 n보다 작거나 같아야 합니다. 예를 들어 합성수 n은 n의 근보다 작거나 같은 인수를 가져야 합니다. 따라서 숫자 n의 경우 루트 숫자 n보다 작거나 같은 인수가 있는지 확인하십시오(n보다 작거나 같은 인수를 확인하면 루프 수가 감소하므로 단순화의 이유이기도 함)

예를 들어, 36은 합성 숫자입니다. 36의 제곱근은 6입니다. 또한 36에는 1, 2, 3, 4, 6, 9, 36과 같은 여러 인수가 있습니다. 그 중 1, 2, 3, 4는 모두 6보다 작습니다.

36 = 4 * 9 = 6 * 6. 그 중 4<6, 9>6. 이것이 "수 n에 대해 n=a*b로 분해될 수 있다면, a와 b 중 하나는 근 n보다 크거나 같아야 하고, 다른 하나는 더 작거나 같아야 한다"고 말하는 이유입니다. 근 n으로, 즉 합성수 n은 반드시 n의 근보다 작거나 같은 인수가 있습니다."

그래서 이것이 숫자가 소수인지 판단할 때 두 번째 방법을 사용할 수 있는 이유입니다. 즉, 제곱근보다 작거나 같은 인수가 있는지 여부만 판단하면 됩니다. n은 소수가 아닙니다. 반대로 숫자 n은 소수입니다.

추천

출처blog.csdn.net/qq_44731019/article/details/123609785