当前位置:   article > 正文

PTA 编程题(C语言)-- 统计素数并求和_pta统计素数并求和

pta统计素数并求和

题目作者:张彤彧 浙江大学

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

思路1:这里是要统计[M,N]闭区间内所有素数的个数和它们的和。我们用两层循环,外层循环枚举出所有正整数i,M<=i<=N;用里层循环判断i是不是素数,若是素数就给计个数加1,和加i;若不是素数,就继续外层循环。

要判断出一个正整数是不是素数,这就是素数判定问题。根据素数的定义,一个大于等于2的正整数p,如果它只能被1和p本身整除,那么p是素数。于是我们用最原始的办法,用循环枚举出所有的正整数j,2<=j<=p-1;若某一个j能整除p,即p%j==0, 那么我们就可以标记p为合数,然后跳出循环(因为后面的遍历是没有意义的);若直到循环结束都p都没有被标记为合数,说明p确实没有1和p本身以外的其他因子,即p是素数。当然这里可以做一个简单的优化,可以不用枚举2到p-1之间的所有正整数,只需要枚举2到sqrt(p)之间的所有正整数即可。

注意:对1要单独处理,显然1也是只能被1和它本身整除的正整数,所以如果遇到1,我们不要用循环去判断它,直接跳过。在一个循环里,要跳过循环体后面所有的代码,并执行下一轮循环,用continue语句。

代码1:
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main () {
  4. int M,N,i,j,cnt=0,sum=0,flag = 1;
  5. scanf("%d%d", &M, &N);
  6. for (i = M; i <= N; i++) {
  7. flag = 1;
  8. if (i == 1) continue; // 注意,这里对i==1的情况要单独处理
  9. for (j = 2; j <= sqrt(i); j++) {
  10. if (i%j == 0) {
  11. flag = 0;
  12. break;
  13. }
  14. }
  15. if (flag) {
  16. cnt++;
  17. sum += i;
  18. }
  19. }
  20. printf("%d %d", cnt, sum);
  21. return 0;
  22. }

我们还可以把判定素数的代码封装成一个函数,得到如下的代码:

代码2:
  1. #include <stdio.h>
  2. int isPrime (int P) { //定义一个函数,用来判断一个数P是不是素数,是返回1,不是返回0
  3. int i, flag = 1;
  4. for (i = 2; i <= sqrt(P); i++) {
  5. if (P%i == 0) {
  6. flag = 0;
  7. break;
  8. }
  9. }
  10. return (P <= 1) ? 0 : flag;
  11. }
  12. int main () {
  13. int i,M,N,cnt=0,sum=0;
  14. scanf("%d%d", &M, &N);
  15. for (i = M; i <= N; i++) {
  16. if(isPrime(i)) {
  17. cnt++;
  18. sum+=i;
  19. }
  20. }
  21. printf("%d %d", cnt, sum);
  22. }

更多PTA题目的的参考代码,可以在下面的小程序里找到哦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/329064
推荐阅读
相关标签
  

闽ICP备14008679号