题意:求n的因子中,不含a*a作为因子的最大的那个。
直接暴力就行了,先从最大的开始,注意如果用sqrt(n)一定要注意,因为sqrt(n)可能不是但是一取整就是了,这里是一个坑点
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int is_s(__int64 x)
{
int flag = 0;
for(__int64 i=2;i*i<=x;i++)
if(x%(i*i) == 0)
{
flag = 1;
break;
}
if(flag) return 0;
else return 1;
}
int main()
{
__int64 n;
while(scanf("%I64d",&n) != EOF)
{
int flag = 0;
__int64 s,i,j;
for(i=1;i*i<=n;i++)
{
if(n%i == 0)
if(is_s(n/i))
{
s = n/i;
flag = 1;
break;
}
}
if(flag) printf("%I64d\n", s);
else
{
for(j=i;j>0;j--) //之前写的j=sqrt(n),不可以
if(n%j == 0)
if(is_s(j))
{
s = j;
break;
}
printf("%I64d\n", s);
}
}
return 0;
}
还能优化:
for(ll i = 2;i * i <= n; i ++) if(x % i == 0){
ans *= (ll) i;
while(x % i == 0)
x /= i;
}
if(x > 1)
ans *= x;
cout << ans << endl;