zoukankan      html  css  js  c++  java
  • 分解质因数FZU

    题目简述:就是给一个数,把他拆分成多个素数的乘积,这正好是算术基本定理。本题我的解决方法是埃氏素数筛+质因数保存。。。开始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("
    ");
    70     }
    71     return 0;
    72 }
    有不懂欢迎咨询 QQ:1326487164(添加时记得备注)
  • 相关阅读:
    Python基础(一)
    计算机编程和编程语言
    初始Markdown
    Python模块
    Python递归以及面向过程编程
    Python推导式和匿名函数
    Python学闭包函数和装饰器
    Python函数的特点
    Python文件高级应用和如何使用函数
    Python字符编码和文件处理
  • 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/8946762.html
Copyright © 2011-2022 走看看