解决质数问题

问题如下,
一个大于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;
    }
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值