第十五题
3-13难度系数1 判断素数 (5分)
素数怎么判断
一开始的思路
把一个数让它除以 从2开始直到它本身减一
如果有出现整除就说明这个数不是素数
bool isprime(unsigned int inp){
if(inp == 1)return false;
for(unsigned int i = 2;i < inp ;++i){
if(inp % i == 0){
return false;
}
}
return true;
}
注:在一个函数中一旦return
就跳出了这个函数
这个输入111
这些小的数速度还挺快
但是输入2147483647
时间就会很长
测试用例
10
2147483647
2147483647
2147483647
2147483647
2147483647
2147483647
2147483647
2147483647
2147483647
2147483647
测试结果,超时了
但有没有快一点的算法呢?
答案是:没有
有有有
现在认真思考一下因数的组成
6 : 1,2,3,6
23 : 1,23
49 : 1,7,49
124 : 1,2,2,4,31,62,124
认真观察就会发现
一个数n的因数会被根号n分开成两部分
6 : 1,2,sqrt(6),3,6
23 : 1,sqrt(23),23
49 : 1,sqrt(49) = 7,49
124 : 1,2,2,4,sqrt(124),31,62,124
欸,这样不就只要判断一半就好了吗
来修改一下代码
bool isprime(unsigned int inp){
if(inp == 1)return false;
unsigned int tmp;
tmp = (int)sqrt(inp); // 向下取整就可以了
for(unsigned int i = 2; i <= tmp ; ++i){
if(inp % i == 0){
return false;
}
}
return true;
}
参考文章 解答:为什么判断一个数是否为素数时只需开平方根就行了!
这样就不超时了
加上输入与输出
又解完一题,嘻嘻
完整代码
#include<iostream>
#include<math.h>
using namespace std;
bool isprime(unsigned int inp){
if(inp == 1)return false;
unsigned int tmp;
tmp = (int)sqrt(inp);
for(unsigned int i = 2;i <= tmp ;++i){
if(inp % i == 0){
return false;
}
}
return true;
}
int main(){
int ind;
unsigned int inp;
cin >> ind;
for(int i = 1 ; i <= ind;++i){
cin >> inp;
if(isprime(inp)) cout << "Yes";
else cout << "No";
cout << endl;
}
return 0;
}
提交结果
当然这是比较快的算法,有兴趣的同学可以了解一下 素数筛
和一位大佬的写的心得华师PTA做题心得-2020程序设计基础实验作业题目集#3-13 判断素数 AC