本题要求统计给定整数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==1,M=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] 的时候 ,我们的程序输出结果会出错。