7-33 统计素数并求和(详解个人思路)

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

输入格式:

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

输出格式:

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

输入样例:

10 31

输出样例:

7 143

原代码: (后续我会拆开来讲解)

#include<stdio.h>
void prime(int M,int N);

int main()
{
    int M,N;
    scanf("%d %d",&M,&N);
    //M=10;
    //N=31;
    prime(M,N);
    
    return 0;
}


void prime(int M,int N)
{
    int cnt=0;
    int sum=0;
    int i,k;
    if(M==1)
		M=2; 
    for(i=M;i<=N;i++)
    {
    	int isprime =1;
        if(i%2==0&&i!=2)
        {
            isprime=-1;
            
        }
        if (isprime == 1){
		
	        for(k=3;k<i;k+=2)
	        {
	            if(i%k==0)
	            {
	                isprime =-1;
	                break;
	            }
	            
	          
	        }
     	}
         
		if(isprime==1)
		{
			cnt++;
			sum+=i;
		}  
		//printf("cnt = %d sum = %d\n",cnt,sum);
        
    }
    printf("%d %d",cnt,sum);
    
    
}

用了个VOID函数来输出答案,几个变量应该还比较好懂,一个计数器一个加和还有两个循环要用的i和k。

紧接着接了一个判断,如果M==1M=2.。这里看不懂没关系,先了解函数具体做了什么再回到这里。


做了一个FOR循环,用于判断区间中每个数是否为素数,所以 i=M,i<=N,i++  这样才可以遍历到所有的区间数,离开循环的时候i=N+1

在这个主循环的内部,我们使得isprime=1,这样每次步进之后isprime都为1,意思是区间的每个数在做判断之前我都默认它是素数。

第一个判断,判断区间数是否为偶数且不为2,如果是,isprime=-1

第二个判断,如果通过了第一个判断,说明区间数不是偶数,是奇数。首先明确什么叫素数,素数就是除了1和它本身之外,不会被整除的一个数。所以我做了一个for循环来判断区间数,k=3, k<i,k+=2。这样就可以让区间数只除以3/5/7......直至离开循环,注意到第二个判断的区间数绝对是奇数,所以我们只需要判断它能否被奇数整除即可,如果可以被整除我们就输出isprime=-1;同时break跳出这个循环。

第三个判断,如果一个区间数能通过前两个循环,说明它是一个素数,cnt计数器 ++,并加和该个区间数 i ;

在主循环之后输出我们的CNT 和SUM 的值,回到我们的一个问题,如果M==1的时候 不使得它M=2,在接下来的判断之中,1是会被认为是一个素数,这让会使得当我们区间是 [1,N] 的时候 ,我们的程序输出结果会出错。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值