描述
输入m,输出2到m之间(包含2和m)所有素数之和。
输入
一个正整数n,表示测试案例的数量。
每组案例中有一个正整数m。
输出
针对每组案例,输出一个整数,表示2到m之间(包含2和m)所有素数之和。每组案例输出完都要换行。
样例输入
2
5
10
样例输出
10
17
HINT
2到5之间素数的和是2+3+5=10
2到10之间素数的和是2+3+5+7=17
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n, m;
cin >> n;
while (n--)
{
cin >> m;
int sum = 0;
for (int i = 2; i <= m; i++)
{
bool f = false;//false表示没有发生过,true表示发生过
for (int p = 2; p <= sqrt(i); p++)
{
if (i % p == 0)//发生过,i为非素数
{
f = true;
break;
}
}
if (!f)//i为素数
{
sum += i;
}
}
cout << sum << endl;
}
return 0;
}
总结:
①重点:循环嵌套。
最外层表示案例的数量,可用while(n- -)表示,简洁明了;
while内包含for循环嵌套:其中,外层的for循环是为了让从2到输入的数的所有数都能进行一次判断;内部的循环是为了判断数是不是素数,若是素数,则把其值加入sum。
②使用sqrt(a)、abs(a)、pow(a,b)等需要引入头文件cmath;
③常见的错误:1)每次循环没有把sum的值,bool类型的值复位;应该在while里定义sum=0,在大的for循环体定义布尔值;否则会导致输入的是相同的数,输出的结果却不同!
2)漏写break;