HDOJ-2012 C语言详细解析

 对题目进行分析,发现需要构造两个for循环和一个while循环

while循环即while(scanf())输入循环,当x=0 && y == 0 时退出即可

第一个for循环是当n取[x,y]的整数时,计算n^2+n+41的所有值

第二个for循环是对n^2+n+41的值进行素数判断

注意:必须n^2+2+41的所有值都是素数,才可以输出OK,否则输出sorry

所以可以添加计数器,初值为0,当有一个值是非素数是,cnt++,如果cnt的结果最后为0,说明没有非素数,输出ok即可

#include <stdio.h>
#include <math.h>

int isPrime(int i);                 //素数判断函数

int main()
{
	int n;
	int x,y;
	int cnt;
	float ans;
	
	while(scanf("%d %d",&x,&y))
	{
		if(x >= (-39) && y <= 50 && x <= y)  //给定范围的x,y
		{
			if(x == 0 && y == 0) break;      //停止
			ans = 0;
			cnt = 0;
			for(int n = x;n<=y;n++)
			{
				ans = n * n + n + 41;
				if(!isPrime(ans))            
				{
					cnt++;                    //如果输出的值为非素数,cnt++
				}
			}
			if(cnt == 0)
			{
				printf("OK\n");
			}else printf("sorry\n");
		}else printf("数据错误");
	}
	return 0;
}

int isPrime(int i)
{
	for(int j = 2;j<=sqrt(i);j++)
	{
		if(i % j == 0)
		{
			return 0;
		}
	}
	return 1;
}

判断 i 是否是素数,只需要除到sqrt(i)即可,如果没有发现可以整除的,说明 i 为素数。

相较于最初学的方法,当 i 非常大时,可以极大减少循环的次数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crkylin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值