题目概述:
在右侧编辑器中的 Begin-End 之间补充代码,输入正整数 n 和 k(数据由平台提供,n 与 k 之间用一个空格隔开,你需要获取后使用),要求输出 n 以内最大的前 k 个素数,按降序排列并在最后输出它们的和。
提示:本关需要用到循环控制结构来解决。素数范围是 2 到 n,因为要从大到小输出素数,所以可以从 n 循环到 2 ,使用 for 语句递减循环实现为:
for (int i = n; i>=2; i--)
第一次进入循环时 i 的值为n,每次循环结束后 i 的值减 1,再次进入循环,…… ,最后一次进入循环时 i 的值为 2,之后再次减 1 后 i 的值为 1,循环条件不满足退出循环。
循环体中则使用上一关的方法判断 i 是否是素数,是则输出、计数并计算累加和。
但该循环有可能不会循环到 i 为 2,因为循环过程中可能已经找到了 k 个素数,这时就需要提前结束循环。根据条件提前结束循环可以使用 break 语句。如果素数计数变量为 m,则对应的语句为:
if(m == k)
break;
在每次找到一个素数,并计数后执行上述语句,如果 m 的值等于 k,则已经找到 k 个素数,就执行 break 语句,该语句的作用是跳出直接包含该语句的 switch 语句或循环语句。
测试举例
输入
9994 7
输出
9973 9967 9949 9941 9931 9929 9923 69613
思路解析:
题目要求倒序从n开始输出k个质数,并且最后还要输出质数之和,题目很简单,具体的题录就是定义一个检验质数的函数,并且从n开始循环,每找到一个质数就加给初始化值为0的变量count,并且输出该值,k自减1,当k为0时循环结束。
具体代码:
#include <stdio.h>
#include <stdlib.h>
int fun(int n)
{
if(n<2)
return 0;
else
{
if(n == 2||n == 3)
return 1;
else
{
if(n%6!=1&&n%6!=5)
return 0;
else
{
int i = 5;
while(i*i<=n)
{
if(n%i==0||n%(i+2)==0)
return 0;
i+=6;
}
}
}
}
return 1;
}//素数判断函数
int main()
{
int n,k; // n为素数范围,k为查找的素数个数
int count = 0;
scanf("%d%d",&n,&k);
for(int i = n;i>=2&&k;i--)//注意判断条件包含k!=0
if(fun(i))
{
printf("%d ",i);
count+=i;
k--;
}
printf("%d",count);
return 0;
}
注意:
这道题n的范围或者素数和的范围可能会非常大,根据条件选择数据类型。
分享这道题的目的并不是讲解这道题的思路,因为我相信只要有一点点的编程基础看完题目后也能很快找到题目的解法,我提出这道题是想分享这个判断素数的方法。
int fun(int n)
{
if(n<2)
return 0;
else
{
if(n == 2||n == 3)
return 1;
else
{
if(n%6!=1&&n%6!=5)
return 0;
else
{
int i = 5;
while(i*i<=n)
{
if(n%i==0||n%(i+2)==0)
return 0;
i+=6;
}
}
}
}
return 1;
}
对于单个的素数求解速度非常快,另外还有求解多个素数的欧拉筛法,大家可以自行去网上搜索。