例1:求100~200之间的全部素数
核心算法:
第一个for语句对100~200之间的所有数字(无需考虑1,2,3的特殊情况)进行遍历,第二个for语句对遍历到的数字进行判断,看能否被2 ~ i之间的整数整除
注:
①包含在头文件math.h中的sqrt()函数:double sqrt(double x),返回x的开方值
②只要在2~i能找到一个可以整除i的数就判断i不是素数;但只有直到最后一个数都不能整除i才能判断i是素数(还要判断内循环已全部遍历)
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n=0;
for(i=100;1<=200;i++)
for(j=2;j<=sqrt(i);j++)
{
if(i%j==0)/*如果i能被2~i之间的任何一个数整除,说明i不是素数,结束循环*/
break;
else
if(j>sqrt(i)-1)/*不能整除时,判断j是否是最接近或等于i的,如果是则证明时素数*/
{
printf("%d",i);
n++;
if(n%5==0)
printf("\n");
}
else/*如果不是最接近或等于i的则继续下次循环*/
continue;
}
return 0;
}
例2:计算1~2019之间所有素数的和
核心算法:
i=1,2,3时不执行判断能否被整除的内层循环for(j=2;j<=i/2;j++)
①因为1不是素数可以把i=1直接排除出外层遍历范围,
使用flag断言标志,i=2,3时flag==1; 只有判断不是素数时flag=0,不累加
②也可以把1,2,3都排除出外层遍历循环,直接从4开始遍历,只要最后求和时加5
注:
循环终止或不执行的情况:
①不符合循环条 ②遇到break语句
#include<stdio.h>
int main()
{
int i,j,sum=0,flag;
for(i=2;i<=2019;i++)/*1不是素数,已排除,无需判断*/
{
flag=1;
for(j=2;j<=i/2;j++)/*i=2,3时,不符合循环条件不执行内循环,但2和3也是素数,却不进行素数判断,外循环遍历到i=4时才开始执行内循环*/
{
if(i%j==0)
{
flag=0;/*只有找到能整除i的数时flag=0,不累加*/
break;
}
}
/*一层内循环已全部遍历,可以确定该数i的flag,即是否为素数*/
if(flag==1)/*flag=1时包括i=2,3和4~2019之间的素数,即时累加求和*/
sum+=i;
}
printf("%d",sum);
return 0;
}
或
#include<stdio.h>
int main()
{
int i,j,sum=5;
for(i=4;i<=2019;i++)/*已知1不是素数,2和3是素数,无需判断*/
{
for(j=2;j<=i/2;j++)
{
if(i%j==0)
break;
else if(j>i/2-1)/*已全部遍历,j+1>i/2,换下一个数判断*/
sum+=i;
else
continue;
}
printf("%d",sum);
return 0;
}