There should be a better approach to improve the time complexity.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <cmath>
#define ull unsigned long long
#define ll long long
using namespace std;
bool prime[35000000];
vector<int> prm;
int main()
{
double n;
int mxprime,cnt;
ull num;
for(int i=2;i<35000000;i++)
{
if(prime[i]==0)
{
prm.push_back(i);
for(int j=i+i;j<35000000;j+=i)
{
prime[j]=1;
}
}
}
while(scanf("%lf",&n),n!=0)
{
mxprime=-1;
if(n<0)
num=n*(-1);
else
num=n;
if(n==1 || n==2 || n==3)
{
printf("-1\n");
}
else
{
int idx=prm.size();
cnt=0;
for(int i=0;i<idx;i++)
{
if(num<prm[i])
break;
if(num%prm[i]==0)
{
mxprime= (mxprime>prm[i]?mxprime:prm[i]);
cnt+=1;
}
while(num%prm[i]==0)
{
num/=prm[i];
}
}
if(num==1)
{
if(n!=mxprime)
{
if(cnt>1)
printf("%d\n",mxprime);
else
printf("-1\n");
}
else
printf("-1\n");
}
else
{
if(mxprime<num)
printf("%llu\n",num);
else
{
if(cnt>1)
printf("%d\n",mxprime);
else
printf("-1\n");
}
}
}
}
return 0;
}