[蓝蓝计算机考研算法]-day1判断素数&求完数

141 阅读1分钟

判断素数

题目描述

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

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

思路

法1 若一个数,除了1和它自身外,还有其他因数(能被其他因数整除),则不是素数,用for循环加判定。

法2(优化)若一个数不是质数,则其至少有两个因子,一个因子比此数开方后大,一个因子比此数开方后小。例如:16=2×8, 2<4, 8>4 或 27=3×9, 3<5.1, 9>5.1, 因此,可以将判定条件缩小至开方,若比开方数小且能整除,则不是质数。

具体实现

法1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,j;
	cin>>a;
	for(j=2; j<a; j++){
            if(a%j==0){
		cout<<a<<"不是素数";
		break; //判断出不是素数后,跳出循环,避免一直判断、输出
            }
	}
	if(a==j) //不是1,是自身
	cout<<a<<"是素数";
	return 0;
}

法2

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,j;
	cin>>a;
	for(j=2; j<=sqrt(a); j++){
		if(a%j==0){
			cout<<a<<"不是素数";
			break;
		}
	}
	if(j>sqrt(a))
	cout<<a<<"是素数";
	return 0;
}

补充

开方函数sqrt()的头文件为algorithm。

求完数

题目描述

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

(所有的真因数的和等于本真的数字称为完数。例如:6的约数有1、2、3、6,除去自身6,其余相加等于6,则6为完数。)

思路

  • 确定范围i,用for循环遍历每一个数。

  • 确定因子范围j,用for循环遍历,看是否为因子。所以是双层嵌套循环。

  • 因子相加为sum,判断sum是否等于i,若相等,则为完数。

具体实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int i,j;
	int sum=0;
	for(i=2; i<=20000; i++){     //i是选定数的范围 
            sum=0;                  //保证每次sum都是从0开始
            for(j=1; j<i; j++){     //j是因子范围 
		if(i%j==0)
		sum+=j;
            }
            if(sum==i)
		cout<<sum<<endl;	
	}
	return 0;
}

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情