[蓝蓝计算机考研算法训练二期]-day01

223 阅读3分钟

1、从键盘输入一个整数,判断该数是否为素数。

什么是素数

素数(质数)是指大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

方法一

暴力解

思路

输入x,将x分别与从2到x-1的数进行整除,若可以整除,则x不为素数,若不能整除,则x为素数。

具体实现

#include<stdio.h>
int main(){
	//用于保存输入的数 
	int x;
	//用于判断输入次数 
	int i;
	//用于判断是否是素数,0代表不是素数,1代表是素数 
	int flag = 1;
	printf("请输入一个整数:");
	scanf("%d", &x);
	//判断是否能整除从2开始的自然数,即判断是否是素数 
	for(i=2; i<x; i++){
		//是素数,跳出循环 
		if(x%i == 0){
			flag = 0;
			break; 
		}
		//不是素数则不进行判断,flag仍为1 
	}
	//根据flag来进行不同的输出 
	if(flag == 0)
		printf("%d不是素数\n", x);
	else
		printf("%d是素数\n", x);
	return 0; 
}

01.png

10AM@3Z6S@5M%{JUJW5%D.png

方法二

用奇数

思路

输入x,将x分别与从2和3到x-1中的奇数 进行整除,若可以整除,则x不为素数,若不能整除,则x为素数。

具体实现

#include<stdio.h>
int main(){
	//用于保存输入的数 
	int x;
	//用于判断输入次数 
	int i;
	//用于判断是否是素数,0代表不是素数,1代表是素数 
	int flag = 1;
	printf("请输入一个整数:");
	scanf("%d", &x);
	if(x%2 == 0)
		flag = 0;
	else
		//判断是否能整除从3开始的奇数,即判断是否是素数 
		for(i=3; i<x; i+=2){
			//是素数,跳出循环 
			if(x%i == 0){
				flag = 0;
				break; 
			}
			//不是素数则不进行判断,flag仍为1 
		}
	//根据flag来进行不同的输出 
	if(flag == 0)
		printf("%d不是素数\n", x);
	else
		printf("%d是素数\n", x);
	return 0; 
}

02.png

03.png

方法三

开平方

思路

为什么使用开平方?

输入x,假设x = a * b,如:

36 = 2 * 18 = 18 * 2,

36 = 3 * 12 = 12 * 3,

36 = 4 * 9 = 9 * 4,

36 = 6 * 6,

通过举例可以假设,a总是小于等于b,那么我们只需要计算x与从2到x的开平方那个数的整除关系,再结合方法二,只需要计算的数就是,2和3到x\sqrt{x}之间的奇数。

具体实现

#include<stdio.h>
#include<math.h>
int main(){
	//用于保存输入的数 
	int x;
	//用于判断输入次数 
	int i;
	//用于判断是否是素数,0代表不是素数,1代表是素数 
	int flag = 1;
	printf("请输入一个整数:");
	scanf("%d", &x);
	if(x%2 == 0)
		flag = 0;
	else
		//判断是否能整除从3开始到x平方根的奇数,即判断是否是素数 
		for(i=3; i<=sqrt(x); i+=2){
			//是素数,跳出循环 
			if(x%i == 0){
				flag = 0;
				break; 
			}
			//不是素数则不进行判断,flag仍为1 
		}
	//根据flag来进行不同的输出 
	if(flag == 0)
		printf("%d不是素数\n", x);
	else
		printf("%d是素数\n", x);
	return 0; 
}

04.png

05.png

因为方法三其实多做了额外的乘法计算,所以在小数额素数判断时,方法三不一定能取得较好的效果,但是方法三的数学思路却不失为我们研究算法的一个好的切入点。

2、求解从2到20000的所有完数。

什么是完数

完数是指所有的真因数的和等于本身的数字。

思路

遍历从2到2000的所有整数,分别判断是否为完数(思路与素数判断刚好相反),如果是完数,则输出,如果不是,则进行下一个数字的判断。

具体实现

#include<stdio.h>
int judgePerfect(int n);

int main(void){
	//当前进行完数判断的数字
	int n;
	//是否为完数标志,0为不是完数,1为是完数 
	int flag;
	for(n=2; n<=20000; n++) {
		flag = judgePerfect(n);
		if(flag == 1)
			printf("%d\n", n);
	}
	return 0;
}

int judgePerfect(int n) {
	int i;
	//将所有的真因数进行求和 
	int s=0;
	for(i=1; i<n; i++) {
		if((n%i)==0) {
			s += i;
		}
	}
	if(s == n)
		return 1;
	else
		return 0;
}

01.png

写在最后:经历的考研初试的“折磨”,过年的喜庆加上有意的放肆,体重上涨的同时知识储备却在不断地下降,正好蓝哥发了算法二期,跟着做一做,不管能有多少收获,坚持本身,就是一种胜利。