hdu 2012 素数判定(打表)(备战LQB)

按教程继续备战LQB。

题意是让你判断表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),该表达式的值是否都为素数。


打表法的素数判断。


直接上教程原文:

首先让我们来看看这些都是什么数。

#include <stdio.h>

int main(void)
{
	int i, c;
	for (c = 1, i = -39; i <51; i++)
	{
		printf("%-5d", i * i + i + 41);
		if (c++ % 10 == 0) putchar('\n');
	}
	return 0;
}
运行结果:
1523 1447 1373 1301 1231 1163 1097 1033 971  911
853  797  743  691  641  593  547  503  461  421
383  347  313  281  251  223  197  173  151  131
113  97   83   71   61   53   47   43   41   41
43   47   53   61   71   83   97   113  131  151
173  197  223  251  281  313  347  383  421  461
503  547  593  641  691  743  797  853  911  971
1033 1097 1163 1231 1301 1373 1447 1523 1601 1681
1763 1847 1933 2021 2111 2203 2297 2393 2491 2591

最大的数是2591,数据量非常小。所以判断素数的函数也不同这么花哨了。呵呵。
对刚才的代码稍作修改,就能得到其是否为素数的判断矩阵:

#include <stdio.h>

int isprime(int n)
{
	int i;

	if (n < 2) return 0;
	for (i = 2; i * i <= n; i++)
	{
		if (n % i == 0)
			return 0;
	}

	return 1;
}

int main(void)
{
	int i, c;
	for (c = 1, i = -39; i <51; i++)
	{
		printf("%-2d", isprime(i * i + i + 41));
		//printf("%-5d", i * i + i + 41);
		if (c++ % 10 == 0) putchar('\n');
	}
	return 0;
}
运行结果:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 0
0 1 1 0 1 1 1 1 0 1

把结果保存入一个数组里,直接提交。^_^ 

代码:

#include<stdio.h>

int main()
{
    int m, n;
    int x[] =
    {
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1
    };

    while (scanf("%d%d", &m, &n)!=EOF)
    {
        if(m==0&&n==0)
            break;
        for (m += 39, n += 39; x[m] && m <= n ; m++); //因为表x[]是从-39开始。所以初始两个数都+39。
            puts(m > n ? "OK" : "Sorry");
    }

    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值