分解质因数FZU - 1075

题目简述:就是给一个数,把他拆分成多个素数的乘积,这正好是算术基本定理。本题我的解决方法是埃氏素数筛+质因数保存。。。开始T掉了,是因为我在最后枚举了素数,保存他们的次数,然后两次for去查询他们的次数这样需要遍历前面所有素数。显的十分浪费时间,因为如果给的数非常大,并且次数小的次数很多那么我们外面的第一层FOR就是N第二层是一个遍历内部次数输出也达到挺大程度(素数小的并且多的化N*M会很大)加上T的话很可能会超时,其实直接保存质因数在另一个素数就可以了,然后遍历输出即可(在此警醒自己,做题不要拿着题目就开做直接暴力,要精简算法的复杂程度,理清思路,这样避免后面来改动)

算术基本定理可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积

最后上代码

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 using namespace std;
 5 const int MAXN=65536;
 6 bool isPrim[MAXN];
 7 int prime[MAXN];
 8 int cnt[MAXN];
 9 int sum,cnt1;
10 void initPrime()
11 {
12     int i;
13     memset(isPrim,0,sizeof(0));
14     isPrim[0]=0;
15     isPrim[1]=0;
16     int k=0;
17     for (i=2; i<MAXN; i++)
18     {
19         if (!isPrim[i])
20         {
21             prime[k++]=i;
22             int j=2;
23             while (i*j<MAXN)
24             {
25                 isPrim[i*j]=1;
26                 j++;
27             }
28         }
29     }
30     sum=k;
31     return;
32 }
33 void sovl(int x)
34 {
35     for (int i=0; ; i++)
36     {
37         if (prime[i]>x)break;
38         while (x % prime[i]==0)
39         {
40             cnt1++;
41             cnt[cnt1]=prime[i];
42             x=x/prime[i];
43         }
44     }
45     return;
46 }
47 int main()
48 {
49     initPrime();
50     int t,num,time;
51     scanf("%d",&t);
52     while (t--)
53     {
54         memset(cnt,0,sizeof(cnt));
55         scanf("%d",&num);
56         time=0;
57         cnt1=0;
58         sovl(num);
59         for (int i=1; i<=cnt1; i++)
60         {
61             time++;
62             if (time==1)
63             {
64                 printf("%d",cnt[i]);
65             }
66             else
67                 printf("*%d",cnt[i]);
68         }
69         printf("\n");
70     }
71     return 0;
72 }

 

posted @ 2018-04-25 19:38  bluefly-hrbust  阅读(231)  评论(0编辑  收藏  举报