PAT 1059. Prime Factors (25)

http://www.patest.cn/contests/pat-a-practise/1059

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 using namespace std;
 5 
 6 const int MAXN = 100000;
 7 int prime[MAXN];
 8 bool vis[MAXN];
 9 int plen = 0;
10 
11 void mklist() {
12     memset(vis, 0, sizeof(vis));
13     for (int i = 2; i * i < MAXN; ++i) {
14         if (!vis[i]) {
15             for (int j = i * i; j < MAXN; j += i) vis[j] = true;
16         }
17     }
18     for (int i = 2; i < MAXN; ++i) if (!vis[i]) prime[plen++] = i;
19 }
20 
21 int flen = 0;
22 int fac[MAXN][2];
23 void split(long long n) {
24     for (int i = 0; i < plen && prime[i] <= n; ++i) {
25         if (n % prime[i] == 0) {
26             fac[flen][0] = prime[i];
27             fac[flen][1] = 0;
28             while(n % prime[i] == 0) {
29                 ++fac[flen][1];
30                 n /= prime[i];
31             }
32             ++flen;
33         }
34     }
35     if (n != 1) {
36         fac[flen][0] = n;
37         fac[flen++][1] = 1;
38     }
39 }
40 
41 void print(int i) {
42     if (i > 0) putchar('*');
43     if (fac[i][1] > 1) 
44         printf("%d^%d", fac[i][0], fac[i][1]);
45     else printf("%d", fac[i][0]);
46 }
47 
48 int main() {
49     mklist();
50     long long n;
51     scanf("%lld", &n);
52     if (n == 1) {
53         printf("1=1\n");
54         return 0;
55     }
56     split(n);
57     printf("%lld=", n);
58     print(0);
59     for (int i = 1; i < flen; ++i) {
60         print(i);
61     }
62     puts("");
63     return 0;
64 }

 

posted @ 2015-08-05 00:45  ACSeed  Views(243)  Comments(0)    收藏  举报