033 求100~200之间的素数

例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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值