- UID
- 288883
- 在线时间
- 1 小时
- 最后登录
- 1970-1-1
- 注册时间
- 2012-1-1
- 宅魂
- 8 点
- 贡献
- 8 点
- 宅币
- 452 枚
- 灵石
- 65620 块
- 元气(技能点)
- 0 点
- 活跃
- 102 ℃
- 听众
- 25
- 收听
- 0
签到天数: 17 天 连续签到: 1 天 [LV.4]偶尔看看III
荣誉会员
- 积分
- 66622
|

楼主 |
发表于 2013-4-5 16:37:50
|
显示全部楼层
本帖最后由 Whisper1166 于 2013-4-6 19:52 编辑
我来发自己的解法吧:
从测试数据看,最大的数的2591,数据量非常小…
所以我的解法就是,打表!
先来看看公式给的都是什么数:
[mw_shl_code=c,true]#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;
}[/mw_shl_code]
运行结果:
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
嗯…然后对刚才的代码稍微做点修改,来输出一个素数判断矩阵:
[mw_shl_code=c,true]#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;
}[/mw_shl_code]
运行结果:
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
把结果保存到一个数组里,一个判断语句直接提交~
[mw_shl_code=c,true]int main(void)
{
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), m || n)
{
for (m += 39, n += 39; x[m] && m <= n ; m++);
puts(m > n ? "OK" : "Sorry");
}
return 0;
}[/mw_shl_code] |
|