L1-022 奇偶分家变题——质合分家

题目:

给定N个正整数,请统计质数和合数各有多少个?

输入格式:

输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。

输出格式:

在一行中先后输出质数的个数、合数的个数。中间以1个空格分隔。

输入样例:

9
0 1 2 3 4 5 6 7 8

输出样例:

5 3

解答:

题目分析:

题目主要考点在于我们如何判断质数和合数

操作实现:

  1. 我们可以写一个bool型函数 isprime(int n) 来判断变量n是否为质数,内部用for循环实现,这里有个巧妙的点在于循环条件为i<=n/i,是因为当i从小到大循环时,最多当i的平方等于n时可能为合数,再往后算的话,n/i就小于根号n了,计算没有意义,如果存在小于根号n的数是n的因数的话,在n/i之前就已经计算到了,所以我们最多只需要算到n/i就够了

  1. main函数里用一个for循环来输入每一个数并进行判断,如果是质数则count_prime自增,否则count_composite自增,这里要尤其注意0的情况,0既不是质数又不是合数!

代码实现:

#include<iostream>
#include<cstdio>
using namespace std;

bool isprime(int n);

int main()
{
    int n; cin >> n;
    int count_prime = 0, count_composite = 0;
    for(int i = 0; i < n; i++)
    {
        int num; cin >> num;
        if(num == 0) continue;
        if(isprime(num))
            count_prime++;
        else
            count_composite++;
    }
    cout << count_prime << " " << count_composite << endl;
    return 0;
}

bool isprime(int n)
{
    for(int i = 2; i <= n / i; i++)
    {
        if(n % i == 0)
            return false;
    }
    return true;
}

欢迎大家探讨和讨论


修改一下,代码有些问题,正确函数代码应该是这样的

bool isprime(int n)//这个函数只判断一个数是不是质数,不判断一个数是不是合数
{
    if(n == 0 || n == 1)    //1和0既不是质数也不是合数
    return false;
    for(int i = 2; i <= n / i; i++)
    {
        if(n % i == 0)
            return false;
    }
    return true;
}

因为isprime()只判断一个数是不是质数,而不能判断一个数是不是合数,所以我们可以再写一个判断合数的函数(只需吧isprime()里第8行和第10行的false和true调换即可),但是一个数判断两次有点浪费时间,所以不如把主函数里这么修改

int main()
{
    int n; cin >> n;
    int count_prime = 0, count_composite = 0;
    for(int i = 0; i < n; i++)
    {
        int num; cin >> num;
        if(num == 0 || num == 1) continue;    //0和1既不是质数也不是合数,不统计个数
        if(isprime(num))
            count_prime++;
        else
            count_composite++;
    }
    cout << count_prime << " " << count_composite << endl;
    return 0;
}

虽然主函数里加上了这个选择语句,但还是建议大家在prime()函数里写上第3,4行的选择语句,这是为了加深大家对判断质数的印象,以免有时候忘记了,考虑不到而导致有测试点不通过的惨剧发生

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值