注意事项:优化求解过程。
优化1:第二层for循环中的sqrt(i),因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。
优化2:sum相当于计数器,在第二层for循环中,如果sum的的数大于2,那个数绝对不是质数,直接退出其他的不用再除了
样例输入
10000
样例输出
104729
参考代码:
#include<stdio.h>
#include<math.h>
int main() {
int n, a[20000]={0},b[20000]={0},s = 1;
scanf("%d", &n);
//104800只是为了计算题目中要求的最大范围的结果,其他的可以自己试试。注意太大的静态数组无法保存,需要动态扩容才行
for (int i = 2; i <= 104800; i++) {
int sum = 0;//置局部变量sum为计数器,每计算一个数完后就恢复为1
for (int j = 1; j <= sqrt(i); j++) {
if (i % j == 0)
sum++;
if (sum > 2)
break;
}
//用sum来判断什么时候保存进数组
if (sum < 2) {
a[s] = i;//保存进数组a中
s++;//s为记录下标
}
}
//将a数组中的元素重新排序,按序查找输出即可
for(int i = 1;i <= n;i++){
b[i] = a[i];
}
printf("%d", b[n]);
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复