问题标题: 酷町堂:1439 质因数分解

0
0
已解决
李瑞曦
李瑞曦
高级天翼
高级天翼

请大佬帮忙,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追加了内容

不要网址!!


1
已采纳
徐子玄
徐子玄
初级光能
初级光能

……对不起,我是先发问答再做的,我也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!!!

??竟然如此简单??

1
邓涵睿
邓涵睿
中级天翼
中级天翼

分析:一遍遍循环,效率比较低,但可以通过减半和除偶来减少次数,但是依旧不是很理想,数论中有个定论是任意合数都可以由

几个质数乘的,但是目前还没想好怎么运用这个定论,所以将就一下。

PS:这个数肯定是合数,因为1不是质数,所以不可能是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)。

望采纳

0
0
徐子玄
徐子玄
初级光能
初级光能

用埃氏筛法更快!!!

我要回答