九度OJ 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>
#include<string.h>
#define MAX 100001
int primeSize;//统计素数的个数
int prime[MAX];//保存素数
int mark[MAX];//标记是否为素数
void select(){//筛选素数
    int i,j;
    primeSize=0;//素数个数初始化为0
    memset(mark,0,sizeof(mark));//全部初始化标记数组为0
    for(i=2;i<MAX;i++){
        if(mark[i]) continue;//如果已经被标记为1 则表示为非素数继续循环进行判断
        prime[primeSize++]=i;//否则该数是素数,将该数保存至素数数组中
        if(i>400) continue;//如果该数大于400,则继续循环判断
        for(j=i*i;j<=MAX;j+=i)//将该素数的倍数全部标记为非素数
            mark[j]=1;
    }
}
int main(){
    select();
    int N,cnt,i;
    while(~scanf("%d",&N)){//输入该数
        cnt=0;//统计质因数的个数
        for(i=0;i<primeSize;i++){//120
            while(N % prime[i]==0) {//如果该数能够整除素数 2 2 2 3 5
                cnt++;//则累加质因数//1 2 3 4 5
                N/=prime[i];//该数被除数//60 30 15 5 1
            }
        }
        if(N!=1) cnt++;//如果该数最后不是为1,
    //则说明该数本身就是素数,进行循环,没有执行前面的for
        printf("%d\n",cnt);//输出质因数的个数
    }
    return 0;
}

当所求的数字小的时候,则可以另一种解法:

代码如下:

#include<stdio.h>
int Count(int x){
	int i,ans=0;
	for(int i=2;i<=x;i++){
		while(x%i==0){//如果x能够整除i
			x/=i;//则说明是x的一个质因数,而且质因数可以循环
			ans++;//累加
		}
	}
	return ans;//返回统计质因数的个数
}
int main(){
	int x;
	while(~scanf("%d",&x)){
		printf("%d\n",Count(x));
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值