ProjectEuler 3

ProjectEuler 3

13195 的质因数有 5, 7, 13 和 29。
输入n,输出n最大的质因数。

Input

输入第一行组数T, 接下来T行,每行一个整数n。 (1 <= T <= 20) (2 <= n <= 1000000000000)

Output

对于每组数据,输出一个数,表示n最大的质因数。

Sample Input

3
10
17
600851475143

Sample Output

5
17
6857

AC代码:判断一个数是不是素数戳判断一个数是不是素数

#include
#include
using namespace std;
bool fun(long long n);//不定义long long会Wrong Answer。
int main()
{
    int n;
    long long m,i,s,t;
    cin>>n;
    while(n--)
    {
        cin>>m;
        s=sqrt(m);//开方可以把一个很大的数瞬间降低不少。
        t=0;
        for(i=1; i<=s; i++) //暴力会Wrong Answer。m越大,m开方后1~s比s~m遍历少得多,所以选择遍历前半部分。
        {
            if(m%i==0)
            {
                if(fun(i))
                    t=max(t,i);
                if(fun(m/i))
                {
                    t=max(t,m/i);
                    break;//加上后直接从140ms缩短到62ms。如果能进这个if语句,那肯定就是最大质因数,直接得出答案,跳出循环。
                    //要养成优化代码的习惯,哪怕一点。这个break的作用令我震惊。
                }
            }
        }
        cout<<t<<endl;
    }
    return 0;
}
bool fun(long long n)//这个判断素数的办法效率挺高的,值得记忆。
{
    long long i,s=sqrt(n);
    if(n<=3)
        return n>1;
    if(n%6!=1&&n%6!=5)
        return false;
    for(i=5; i<=s; i+=6)
    {
        if(n%i==0||n%(i+2)==0)
            return false;
    }
    return true;
}

永远相信美好

你可能感兴趣的:(天梯赛校赛题)