大家好啊,这里是Cyber Striver的博客。今天我继续为大家带来PAT乙级的题解。
目录
题目
题解
#include <stdio.h>
int main()
{
int m = 0, n = 0, x = 0, i = 0, count = 1, num = 1;
int a[10000];
a[0] = 2;
scanf("%d %d", &m, &n);
for (x = 3; x <= 104730; x += 2)
{
for (i = 2; i * i <= x; i++)
if (x % i == 0)
break;
if (i * i > x)
{
a[count] = x;
count++;
}
}
for (i = m - 1; i < n; i++)
{
if (num % 10 != 0)
{
if (i < n - 1)
printf("%d ", a[i]);
if (i == n - 1)
printf("%d\n", a[i]);
}
else
{
if (i < n - 1)
printf("%d\n", a[i]);
if (i == n - 1)
printf("%d\n", a[i]);
}
num++;
}
return 0;
}
思路
这道题的思路:
1)先设法把一万个素数计算出来并放在一个数组里面待查。(有种密码本的感觉)
2)利用循环输出从第m个素数到第n个素数的值,并且满足满10个换行(末尾无空格),最后一个数字后无空格,且要换行。
来看代码:
第一部分:求出前一万个素数
int a[10000];
a[0] = 2;
scanf("%d %d", &m, &n);
for (x = 3; x <= 104730; x += 2)
{
for (i = 2; i * i <= x; i++)
if (x % i == 0)
break;
if (i * i > x)
{
a[count] = x;
count++;
}
}
这部分代码熟悉不?我们在1007素数对猜想的时候用到的代码。这里需要注意的是,上面的代码不能直接搬过来用,因为第一个素数2并不在其范围内,需要自己声明一下,但是不能把x=3改为x=2,因为这样的话就破坏了奇数的条件。
循环条件要设置好:我的答案WA了一次就是因为这个x的范围没设置好,第一万个素数是104729,为了省空间就比它大一丢丢就可以了。
第二部分:输出
for (i = m - 1; i < n; i++)
{
if (num % 10 != 0)
{
if (i < n - 1)
printf("%d ", a[i]);
if (i == n - 1)
printf("%d\n", a[i]);
}
else
{
if (i < n - 1)
printf("%d\n", a[i]);
if (i == n - 1)
printf("%d\n", a[i]);
}
num++;
}
这部分要注意的就是第m个素数对应的下标是m-1,第n个素数对应的下标是n-1.
然后满足以下输出条件就可以了,难度不大。
经验总结
1)数组中第几个数和下标要分清!
2)注意题设条件从而判断循环条件!也就是审题要审准。
本次博客到这里就结束了,如果你觉得我的文章还不错的话,请给我多多点赞评论哦!