假设给定一个数num, 取值范围为
1
≤
n
u
m
≤
1
0
9
1≤num≤10^9
1≤num≤109
要求它的所有因子,例如当num=100时,则它的所有因子为:1,2,4,5,10,20,25,50,100
如果num很大,循环判断每个数是否是num的因子时间开销太夸张。这里可以优化一下,如果a是num的因子,那么num/a也是num的因子,在每一次循环的时候都将num/a加入数组,当然要注意num/a不等于a,以免重复加入。这样就可以把复杂度降为
O
(
n
)
O(\sqrt{n})
O(n)
核心代码如下:
int y(int a)
{
int now=0;
for (int i = 1; i * i <= a; i++)
{
if (a % i == 0)
{
b[now++] = i;
if (i != a / i)
b[now++] = a / i;
}
}
sort(b, b + now);
return now;
}
附上codeforces上的一道练习题 <<传送门>>
AC代码:
#include <bits/stdc++.h>
#define bug(a) (cout<<'*'<<a<<endl)
#define bugg(a,b) (cout<<'*'<<a<<' '<<b<<endl)
#define buggg(a,b,c) (cout<<'*'<<a<<' '<<b<<' '<<c<<end)
#define pn (cout<<endl)
typedef long long ll;
typedef double db;
using namespace std;
int b[100000];
int y(int a)
{
int now=0;
for (int i = 1; i * i <= a; i++)
{
if (a % i == 0)
{
b[now++] = i;
if (i != a / i)
b[now++] = a / i;
}
}
sort(b, b + now);
return now;
}
int main()
{
int t, n, i, j, x, ans, k, now = 0, len;
scanf("%d", &t);
while (t--)
{
scanf("%d %d", &n, &k);
now = 0;
if (n <= k)
{
printf("1\n");
continue;
}
len=y(n);
for (i = len - 1; i >= 0; i--)
{
if (b[i] <= k)
{
printf("%d\n", n / b[i]);
break;
}
}
}
return 0;
}