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;
}
方法二
用奇数
思路
输入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;
}
方法三
开平方
思路
为什么使用开平方?
输入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到之间的奇数。
具体实现
#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;
}
因为方法三其实多做了额外的乘法计算,所以在小数额素数判断时,方法三不一定能取得较好的效果,但是方法三的数学思路却不失为我们研究算法的一个好的切入点。
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;
}
写在最后:经历的考研初试的“折磨”,过年的喜庆加上有意的放肆,体重上涨的同时知识储备却在不断地下降,正好蓝哥发了算法二期,跟着做一做,不管能有多少收获,坚持本身,就是一种胜利。