问题如下,
一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除则称该数为质数。
例如7就是一个质数,因为它只能被1和7整除。
现在,给定你N个大于1的自然数,请你依次判断这些数是否是质数。
输入格式
第一行包含整数N,表示共有N个测试数据。
接下来N行,每行包含一个自然数X。
输出格式
每个测试用例输出一个结果,每个结果占一行。
如果测试数据是质数,则输出X is prime,其中X是测试数据。
如果测试数据不是质数,则输出Xis not prime,其中X是测试数据。
该题解题思路为
首先我们要输入n,并进行n次循环
#include<iostream>
using namespace std;
int main()
{
int n ;
cin >> n;
while(n--){
}
}
接下来,我们进行整数输入,再从2开始到该整数的前一个数进行遍历,其中进行条件判断,判断其实该整数是否能取余2为0,若为0,说明该数不为质数,直接输出不为质数并跳出循环,若i循环到循环结束(该整数的值-1)时的值相等时,则输出其为质数
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--){
int x;
cin >> x;
for(int i = 2;i < x;i++){
if(x % i == 0){
cout << x << " is not prime" << endl;
break;
}else if(i == x-1){
cout << x << " is prime" << endl;
break;
}
}
}
return 0;
}
但其中,有缺点,当输入2时,他不会有输出,与预期值不符,因此我们需要在for循环外增添一个条件判断,来对2进行判断是否为质数
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while(n--){
int x;
cin >> x;
if(x == 2)cout << x << " is prime" << endl;
for(int i = 2;i < x;i++){
if(x % i == 0){
cout << x << " is not prime" << endl;
break;
}else if(i == x-1){
cout << x << " is prime" << endl;
break;
}
}
}
return 0;
}
其实,我是种暴力解法,大多数编程都会超时,因此我们将进行优化
另一思路
第一步都是相同的,但增添了一个布尔类型的判断变量,先将其定义为true,其目的是保证输入值为2是,直接输出为质数,其次进行for循环从2开始,其值将开根(同时,可以用i * i <= n来同值替换),再进行判断该整数能否整取余2,若可以则该值不为质数,将判断变量赋值为false,跳出该循环,在循环外,再进行条件判断,若判断变量为真,则输出该值为质数,否则,将输出该值不为质数。
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
while(n--){
int x;
cin >> x;
bool p = true;
for(int i = 2; i * i <= x;i++){
if(x % i == 0){
p = false;
break;
}
}
if(p)cout << x << " is prime" << endl;
else cout << x << " is not prime" << endl;
}
}