算法——因子和阶乘
来源:互联网 发布: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
- 算法——因子和阶乘
- 算法竞赛入门——因子和阶乘
- 算法入门之因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 白皮书&&因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- 因子和阶乘
- Codeforces Round #308 (Div. 2) A B C D E
- 数据库的知识点总结
- Tasks and Back Stack
- OC学习--选择器(Selector)
- 关于乐观锁和悲观锁的介绍
- 算法——因子和阶乘
- Linux下的多线程机制--生产者和消费者实例
- 练习代码(一)初始化与清理
- github 上传项目 过滤到cocoapods无用文件
- Android系统编译错误Note: Some input files use or override a deprecated API. 解决办法
- GUI编程初步
- OpenCV 透视变换【图像归一化矫正】
- 当参数为nsarray时,将已有的NSArray转为NSString
- java,可见性