高级天翼
请大佬帮忙,1439超时60分,代码:
#include<iostream>
#include<cmath>
using namespace std;
bool ss(int n){
for(int i=2;i<=sqrt(n);i++){
if (n%i==0){
return false;
}
}
return true;
}
int main(){
int n,m=0;
cin>>n;
for(int i=2;i<=n;i++){
if(n%i==0&&ss(i)==1){
m=max(m,i);
}
}
cout<<m<<" ";
}
李瑞曦在2020-06-14 18:33:47追加了内容
有没有人帮帮我???😭
在线等,急!
李瑞曦在2020-06-14 19:48:03追加了内容
#include<iostream>
using namespace std;
int main()
{
int n,m=0;
cin>>n;
for(int i=2;i<=n;i++)
{
if(n%i==0) {
m=max(m,i);
}
while(n%i==0) n/=i;
}
cout<<m;
return 0;
}
90分,@徐子玄
李瑞曦在2020-06-14 19:48:38追加了内容
不要网址!!
初级光能
……对不起,我是先发问答再做的,我也90分,但我研究了时间复杂度,发现还有另一种极快的方法!!!
徐子玄
Accepted:100分
徐子玄的测评结果:
1 Accepted 0ms
2 Accepted 0ms
3 Accepted 0ms
4 Accepted 0ms
5 Accepted 0ms
6 Accepted 0ms
7 Accepted 0ms
8 Accepted 4ms
9 Accepted 12ms
10 Accepted 0ms
!!!
我的方法就是:
1.找出你第一次提交的超时60分代码;
2.把
if(n%i==0&&ss(i)==1) {
m=max(m,i);
}
改成
if(n%i==0&&ss(i)==1) {
cout<<n/i;//找出n的最小质因数(因为最小质因数找起来非常快:无非就是2,3,5),再拿n除以这个最小质因数,不就是最大质因数了吗???
return 0;//这个一定要有,不然会一直循环下去!!!
}
AC!!!
??竟然如此简单??
中级天翼
分析:一遍遍循环,效率比较低,但可以通过减半和除偶来减少次数,但是依旧不是很理想,数论中有个定论是任意合数都可以由
几个质数乘的,但是目前还没想好怎么运用这个定论,所以将就一下。
PS:这个数肯定是合数,因为1不是质数,所以不可能是1和本身。望采纳
资深光能
这个问题很简单,你要记住,一个数可以看成是两个质数的乘积,你只要枚举n以内的质数,找到n的最小质因数,再让n除最小质因数,得到的数就是最大的了。
for(从2到n){
if(n%i==0&&i是质数){
cout<<n/i;
return 0;
}
}
还有更简单的
for(从2到n){
if(n%i==0){
cout<<n/i;
return 0;
}
}
因为合数=质数*质数,所以可以(如8,会先枚举2而不是4)。
望采纳
中级光能