一、题目详情
问题描述:数素数
令 表示第 i 个素数。现任给两个正整数 M≤N≤,请输出 到 的所有素数。
输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。
输出格式:
输出从 到 的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103
代码长度限制:16 KB
时间限制:200 ms
内存限制:64 MB
二、题目解析
代码:
#include <stdio.h>
#include <math.h>
int main()
{
/*
* start,end:存储素数序列的起始与终止索引
* index:素数序列的当前索引
* number:正整数,从2开始
* sum:每行输出素数的个数
* tmp:计算素数时的临时变量
* i:循环变量
*/
int start, end, number=2, index=0, sum=0, tmp, i;
//通过键盘输入预输出素数序列的起始与终止索引
scanf("%d %d", &start, &end);
//采用无限循环方式,满足条件后结束循环
while(1)
{
//判别该整数number是否为素数
tmp = (int)sqrt(number);
for(i=2;i<=tmp;i++)
if(number % i == 0)//number是非素数
break;
//若为素数,逐行输出索引值在start和end之间的素数
if(i>tmp)//number是素数
{
index++;//素数索引自增1
if(index >= start && index <= end)//在符合条件范围内
{
sum++;//该行素数的个数
if(index == end)//输出符合条件范围内的最后一个素数
{
printf("%d", number);//不带空格
break;//退出循环
}
if(sum % 10 == 0)//每行输出10个,第10个素数后需换行
printf("%d\n", number);//回车换行
else
printf("%d ", number);//带空格
}
else if(index > end)//超出条件范围
break;//退出循环
}
number++;//整数自增1,继续循环
}
return 0;
}
提交结果(分数/满分):
20/20
提示:
1. 判断素数的方法
已在前例中给出,可参见 PAT 1007 解析,相关代码不再赘述。
2. 循环控制结构
鉴于 start 和 end 是随机输入的两个正整数,本例题采用无限循环的方式,并通过判别素数的索引值是否在符合条件范围加以处理,符合条件范围,则输出素数,超出条件范围,则退出无限循环。相关代码如下:
//采用无限循环方式,满足条件后结束循环
while(1)
{
//判别该整数number是否为素数
......
//若为素数,逐行输出索引值在start和end之间的素数
if(i>tmp)//number是素数
{
index++;//素数索引自增1
if(index >= start && index <= end)//在符合条件范围内
{
sum++;//该行素数的个数
if(index == end)//输出符合条件范围内的最后一个素数
{
printf("%d", number);//不带空格
break;//退出循环
}
if(sum % 10 == 0)//每行输出10个,第10个素数后需换行
printf("%d\n", number);//回车换行
else
printf("%d ", number);//带空格
}
else if(index > end)//超出条件范围
break;//退出循环
}
number++;//整数自增1,继续循环
}
该段代码中,包含了“每行输出的素数个数不能超过10个”的解决方法,相关代码如下:
if(sum % 10 == 0)//每行输出10个,第10个素数后需换行
printf("%d\n", number);//回车换行
else
printf("%d ", number);//带空格
与此同时,最后一个素数的后面不能输出多余的空格,相关代码如下:
if(index == end)//输出符合条件范围内的最后一个素数
{
printf("%d", number);//不带空格
break;//退出循环
}