判断素数
题目描述
从键盘输入一个整数,判断该数是否为素数。
(素数:又叫质数,是指在大于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 天,点击查看活动详情