原题链接:矩形
解题思路: 枚举
求最大的素数因子,倒也不用全部枚举,可以先求一个上界,从而从上界往下枚举。因为两个因子均为素数,故因子不等于1,直接将S除以2,以减少枚举次数和量的大小。
参考代码:
#include<stdio.h> #include<math.h> //包含sqrt()函数 _Bool isPrime(int n){ //判断是否为素数 if(n<2) //非素数返回,同时也避免自己测试时输入错误 return 0; int i,root=sqrt(n); for(i=2;i1;--i) //素数因子的最大可能值为S/2 if(S%i==0) //找到一个因子后找另一个因子 for(j=2;j<root;++j) if(isPrime(j)){ printf("%d",i); return 0; } return 0; }
这个程序是纯暴力,每次找第二个因子时都要从2开始调用isPrime()函数,时间花费较大,因此写了另一个程序。另一个程序是通过isPrime()函数找到从2到S/2的所有素数并存在数组里,之后的枚举因子就变成了数组的遍历查找。
但是因为写的时间较短,没有经过严密地思考,程序还有些疏漏,过不了评测,应该是访问了未知空间,但在普通的编辑器上运行还是没什么问题的。我用大大小小的数据测试都可以短时间内运行,代码如下:
#include<stdio.h> #include<math.h> #define MAXN 50000 //一个不大的数组空间 int prime[MAXN]={0}; //存放素数 int cur=0; //游标,这里主要用来记录素数个数 _Bool isPrime(int n){ if(n<2) return 0; int i,root=sqrt(n); for(i=2;i<=root;++i){ if(n%i==0) return 0; } prime[cur++]=n; return 1; } _Bool Find(int n){ //在prime数组中查找当前值 int i; for(i=0;i<cur;++i){ if(n==prime[i]) return 1; } return 0; } int main(){ int i,j,S; scanf("%d",&S); for(i=2;i=0;--i) if(S%prime[i]==0) for(j=0;j<=i;++j) if(Find(j)){ printf("%d",prime[i]); return 0; } return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复