您的位置:首页 > 其它

算法竞赛入门经典-第五章因子和阶乘

2016-11-29 18:08 363 查看
#include<stdio.h>

#include<string.h>
int is_prime(int n) {

  for(int i = 2; i*i <= n; i++)

    if(n % i == 0) return 0;

  return 1;

}
int prime[100], count = 0;

int main() {

  int n, p[100];

  for(int i = 2; i <= 100; i++)

    if(is_prime(i)) prime[count++] = i;
  while(scanf("%d", &n) == 1) {

    printf("%d! =", n);

    memset(p, 0, sizeof(p));

    int maxp = 0;

    for(int i = 1; i <= n; i++) {

      int m = i;

      for(int j = 0; j < count; j++)

        while(m % prime[j] == 0) {//拆分成素数形势start

    //while判断:如果该素数使m的一个因子

          m /= prime[j];//那么更新m成为乘式中非素数的因子

          p[j]++;//j的幂次加1

          if(j > maxp) maxp = j;//拆分成素数形式end

        }

    }

    for(int i = 0; i <= maxp; i++)

      printf(" %d", p[i]);

    printf("\n");

  }

  return 0;

}

//分析思路

//1.将n!=1*2*3...*n每一个乘积项进行素数乘积的检验,看每一项能如何用素数因子表示

//2.将素数因子的幂次累加,就是总的幂

//3.输出.....

//自己为什么没想到这个办法呢?

//因为....感觉自己智商秀下限啊.....

//还是看的代码不够多经验不够丰富....

//还要想一下有没有其他的解决办法那???

//也可以这么做

//1.在1到n中,如果一个乘积项本身就是素数,那么这个素数幂次加1

//2.如果一个乘积项不是素数,那就拆分成素数形式-如何拆分??

//3.对拆分后的项进行统计,++

#include<stdio.h>

#include<string.h>

int is_prime(int n) {

  for(int i = 2; i*i <= n; i++)

    if(n % i == 0) return 0;

  return 1;

}
int prime[100], count = 0;

int main() {

  int n, p[100];

  for(int i = 2; i <= 100; i++)

    if(is_prime(i)) prime[count++] = i;
  while(scanf("%d", &n) == 1) {

    printf("%d! =", n);

    memset(p, 0, sizeof(p));

    int maxp = 0;

    for(int i = 1; i <= n; i++)

    {

        for(j=0;j<count;j++)

        {

            if(j==i)

                {p[j]++;break}

            while(m % prime[j] == 0)

            {//拆分成素数形势start

                                            //while判断:如果该素数使m的一个因子

                m /= prime[j];          //那么更新m成为乘式中非素数的因子

                p[j]++;                 //j的幂次加1

                if(j > maxp) maxp = j;

            }//拆分成素数形式end

        }//判断是否在这个素数表里

    } 

    for(int i = 0; i <= maxp; i++)

      printf(" %d", p[i]);

    printf("\n");

  }

  return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: