题目:
给定N个正整数,请统计质数和合数各有多少个?
输入格式:
输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。
输出格式:
在一行中先后输出质数的个数、合数的个数。中间以1个空格分隔。
输入样例:
9
0 1 2 3 4 5 6 7 8
输出样例:
5 3
解答:
题目分析:
题目主要考点在于我们如何判断质数和合数
操作实现:
我们可以写一个bool型函数 isprime(int n) 来判断变量n是否为质数,内部用for循环实现,这里有个巧妙的点在于循环条件为i<=n/i,是因为当i从小到大循环时,最多当i的平方等于n时可能为合数,再往后算的话,n/i就小于根号n了,计算没有意义,如果存在小于根号n的数是n的因数的话,在n/i之前就已经计算到了,所以我们最多只需要算到n/i就够了
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行的选择语句,这是为了加深大家对判断质数的印象,以免有时候忘记了,考虑不到而导致有测试点不通过的惨剧发生