Through this problem learned 2 knowledge:
1. The qualitative factor of a number must be less than or equal to the open root of this number
2. The number of factors (approximate) is equal to π (the number of factors +1)
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath>using namespace std; const int MAXN = 55555;//#define Debugint vis[maxn];int prime[maxn];int cnt = 0;void getprime () {memset (vis,0,sizeof (vi s)); int m = sqrt (MAXN) + 1; for (int i = 2; l < m; i++) if (!vis[i]) {for (int j = i * i; j < maxn; J + = i) vis[j] = 1; } for (int i = 2; i < MAXN; i++) if (!vis[i]) prime[cnt++] = i; #ifdef DEBUG for (int i = 0; i < cnt; i++) printf ("%d", prime[i]); #endif//Debug}int solve (int n) {int sum = 1; for (int i = 0; i < CNT && n > 1; i++) {if (n prime[i] = = 0) {int c = 1; while (n% prime[i] = = 0) {C + +; n/= Prime[i]; } sum *= C; }} return sum;} int main () {int n,t; Getprime (); scanf ("%d", &t); while (t--) {int A, B; scanf ("%d%d", &a,&b); int temp = 0; int ret; for (int i = A; I <= b; i++) {int e = solve (i); if (Temp < e) {temp = e; ret = i; }} printf ("Between%d and%d,%d has a maximum of%d divisors.\n", a,b,ret,temp); } return 0;}
UVa 294-divisors