分解 n!
2015-08-31 10:48
381 查看
给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为 n=p1^m1*p2^m2*p3^m3…… * 这里 p1 < p2 < p3 < …… 为质数 * 如果 mi = 1, 则 ^ mi 就不需要输出
[code]6=2^4*3^2*5 7=2^4*3^2*5*7
题意:给出n,将n!分解成质因子相乘的形式。
在这里如果每次给出n并且去求小于n的质因子,肯定会超时,因此可以先把1000000以内的质数求出来存在数组里,后面需要直接调用,并且这里求质数不能采用简单的试除法去求,那样效率很低,这里我们采用筛选法求解。
[/code]
#include<iostream> #include<math.h> using namespace std; bool isprime[1000001]; int prime[80000]; int num=0; void getPrime() //用筛选法求算素数 { int i,j; for(i=0;i<1000001;i++) { isprime[i]=true; } for(i=2;i<=1000;i++) //如果isprime[i]==true,即i是素数,那么i,2*i,3*i必定不是素数 { for(j=i+i;j<=1000000;j+=i) { if(isprime[i]==true) isprime[j]=false; } } for(i=2;i<1000001;i++) { if(isprime[i]==true) { prime[num++]=i; } } } int count(int n,int k) //求n!中含有某因子k的个数 { int num=0; while(n) { num+=n/k; n=n/k; } return num; } int main(void) { int n; getPrime(); while(scanf("%d",&n)==1&&(n>1&&n<=1000000)) { int i,j; int m; for(i=0;i<num;i++) { if(prime[i]>n) break; } printf("%d=",n); for(j=0;j<i-1;j++) { m=count(n,prime[j]); if(m>1) printf("%d^%d*",prime[j],m); else printf("%d*",prime[j]); } m=count(n,prime[j]); if(m>1) printf("%d^%d\n",prime[j],m); else printf("%d\n",prime[j]); } return 0; }
相关文章推荐
- HDOJ5122 K.Bro Sorting(树状数组 & 模拟)
- C&C++——库头文件及其作用
- [Leetcode] Combination Sum III
- C#日期函数使用大全
- 使用Chrome修改user agent模拟微信内置浏览器
- 用L脚本语言打印斐波那契数列
- Linux fork炸弹解析 ——Linux Fork Bomb
- Android编程规范
- SSD 下的 MySQL IO 优化尝试
- HttpURLConnection调用rest webservice
- 顺序栈
- 顺序出栈操作
- 51 nod 1046 A^B Mod C(快速幂取余)
- JQuery chosen插件,实现select多选
- C&C++——基本说明
- C&C++——标准库
- Uploadify自定义提示信息
- Oracle时间戳
- controller参数匹配
- git错误