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<iostream>
#include<cmath>
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;
}
永远相信美好🎈