分解素因数 1
2016-02-04 12:34
399 查看
/*
分解素因数
题目1207:质因数的个数
题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
提示:
注意:1不是N的质因数;若N为质数,N是N的质因数。
*/
#include <stdio.h>
#define max 100000
int prime[max+1];
bool mark[max+1];
int primesize;
void init(){
int i,j;
primesize=0;
for(i=1;i<max;i++)
mark[i]=false;
for(i=2;i<=max;i++){
if(mark[i]==true) continue;
prime[primesize++]=i;
if(i>=1000)continue;
for(j=2*i;j<=max;j +=i){
mark[j]=true;
}
}
}
int main(){
init();
int n,i;
while(scanf("%d",&n) != EOF){
int ansprime[30];//分解的素因数
int anssize=0;//分解的素因数个数
int ansnum[30];//分解的素因数的幂指数
for(i=0;i<primesize;i++){
if(n % prime[i] == 0){
ansprime[anssize] = prime[i];
ansnum[anssize]=0;
while(n%prime[i]==0){
ansnum[anssize]++;
n/=prime[i];
}
anssize++;
if(n==1) break;
}
}
if(n != 1){//如果测试完2到max的所有素因数,n!=1,则剩余一个大于max的素因数
ansprime[anssize]=n;
ansnum[anssize++]=1;
}
int ans = 0;
for(i=0;i<anssize;i++){
ans += ansnum[i];//统计各个素因数的幂指数
}
printf("%d\n",ans);
}
return 0;
}
//在本题中素数只需筛选到100000,不用到10^9,这是因为
//n至多只存在一个大于sqrt(n)的素因数,否则两个大于
//sqrt(n)的数相乘大于n
//如果要确定被分解整数因数的个数,只需求出所有指数的
//不同组合,(e1+1)*(e2+1)*...*(en+1)
分解素因数
题目1207:质因数的个数
题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出:
对于每组数据,输出N的质因数的个数。
样例输入:
120
样例输出:
5
提示:
注意:1不是N的质因数;若N为质数,N是N的质因数。
*/
#include <stdio.h>
#define max 100000
int prime[max+1];
bool mark[max+1];
int primesize;
void init(){
int i,j;
primesize=0;
for(i=1;i<max;i++)
mark[i]=false;
for(i=2;i<=max;i++){
if(mark[i]==true) continue;
prime[primesize++]=i;
if(i>=1000)continue;
for(j=2*i;j<=max;j +=i){
mark[j]=true;
}
}
}
int main(){
init();
int n,i;
while(scanf("%d",&n) != EOF){
int ansprime[30];//分解的素因数
int anssize=0;//分解的素因数个数
int ansnum[30];//分解的素因数的幂指数
for(i=0;i<primesize;i++){
if(n % prime[i] == 0){
ansprime[anssize] = prime[i];
ansnum[anssize]=0;
while(n%prime[i]==0){
ansnum[anssize]++;
n/=prime[i];
}
anssize++;
if(n==1) break;
}
}
if(n != 1){//如果测试完2到max的所有素因数,n!=1,则剩余一个大于max的素因数
ansprime[anssize]=n;
ansnum[anssize++]=1;
}
int ans = 0;
for(i=0;i<anssize;i++){
ans += ansnum[i];//统计各个素因数的幂指数
}
printf("%d\n",ans);
}
return 0;
}
//在本题中素数只需筛选到100000,不用到10^9,这是因为
//n至多只存在一个大于sqrt(n)的素因数,否则两个大于
//sqrt(n)的数相乘大于n
//如果要确定被分解整数因数的个数,只需求出所有指数的
//不同组合,(e1+1)*(e2+1)*...*(en+1)
相关文章推荐
- Codeforces Round #341 (Div. 2) 解题报告
- Asp.Net在多线程环境下的状态存储问题
- cocos2d-java错误报错
- springmvc @ResponseBody 乱码
- 测试产生Java内存异常
- .class文件打包成.jar包
- Solr与Cassandra二级缓存实践
- 标注适应:以中文分词和依存分析为例
- Sublime Text 3 快捷键汇总
- 基于Hadoop生态技术构建阿里搜索离线系统
- 旅游行业垂直搜索的架构探索
- 搜索引擎的时效性需求满足
- 错误 1402 无法打开项 UNKNOWN\Components
- HDU 2199(多重背包转化为01背包)
- HDU 4760 Good FireWall 完好Trie题解
- 3.5 意图Intent的概念
- 【HDOJ】4029 Distinct Sub-matrix
- [BZOJ2301][HAOI2011]Problem b
- C++ 实现 AOP(面向切面编程)
- LINUX日志的错误等级