算法——因子和阶乘

来源:互联网 发布:java string搜索 编辑:程序博客网 时间:2024/06/05 04:32

题目描述:输入正整数n(2<=n<=100),把阶乘n!=1x2x3x...xn分解成素因子相乘的形式,从小到大输出各个素数(2、3/5.....)的指数。你的程序应忽略比最大素因子更大的素数(否则末尾会有无穷对个0)。

样例输入:

5

53

样例输出:

5!=3 1 1

53!=49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

代码如下:

#include<stdio.h>#include<string.h>int prime[100],count=0;//用于维持一张素数表int is_prime(int n){for(int i=2;i<n;i++){if(n%i==0) return 0;}//不是素数return 1;}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));//先全部置为0    int maxp=0;//用于记录最大阶乘因子    for(int j=1;j<=n;j++){//阶乘的各个因子分别用于验证素数int m=j;for(int k=0;k<count;k++){while(m%prime[k]==0){m/=prime[k];//用于循环除以阶乘因子p[k]++;//对应素数个数增加if(k>maxp) maxp=k;//记录最大的素因子}//while}}for(i=0;i<=maxp;i++)printf(" %d",p[i]);printf("\n");}return 0;}

注意的问题:(1)is_prime()函数很简单,但是有参考书上给出的循环体:for(int i=2;i*i<n;i++){..}这样得到的素数表中将会包含4,9...,所以要看需要使用,我用的是i<n,这样会增加时间复杂度,但是因为题目给出n<100,所以n并不是很大;(2)看题目是n!,所以在编码的时候可能会想到是不是要先求出n!的值,这样可以少一层循环,但是发现求解n!需要花费更多的时间!所以还是利用阶乘因子直接获得素数的个数比较简单;(3)利用数组可以方便地记录,并且遍历起来也比较方便。



0 0
原创粉丝点击