分解素因数

对一个数分解质因数,使得其满足x=p1^e1*p2^e2*...*pn^en*

例一 九度1207 求质因数的个数

题目描述:
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。
输入:

可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

输出:

对于每组数据,输出N的质因数的个数。

样例输入:
120
样例输出:
5

#include<stdio.h>
bool mark[100001];
int prime[100001];
int primesize;
void init() {
	int i, j;
	primesize = 0;
	for (i = 2; i <= 100000; i++) {
		if (mark[i] == true)	continue;
		prime[primesize++] = i;
		for (j = i*i; j <= 100000; j += i) {
			mark[i] = true;
		}
	}
}

int main() {
	init();
	int n;
	while (scanf("%d", &n) != EOF) {
		int ansprime[30];//按顺序保存分解出来的质因数
		int anssize=0;//素因数的个数
		int ansnum[30];//按顺序保存当前素因数对应的幂指数
		int ans = 0;
		int i, j;
		for (i = 0; i < primesize; i++) {
			if (n%prime[i] == 0) {  //如果当前素数是一个因数
				ansprime[anssize] = prime[i]; //将该因数保存在数组中
				ansnum[anssize] = 0; //初始化当前幂指数为0
				while (n%prime[i] == 0) {  //开始循环判断得出该素因数对应的幂指数
					ansnum[anssize]++; 
					n = n / prime[i];
				}
				anssize++; 
				if (n == 1) break;
			}
		}
		if (n != 1) {  //证明剩余的因数一定是n,一个大于100000的素因数
			ansprime[anssize] = n;
			ansnum[anssize] = 1;
			anssize++;
		}
		for (i = 0; i < anssize; i++) {
			ans += ansnum[i];
		}
		printf("%d\n", ans);
	}
	return 0;
}

九度1104 整除问题(比较难,上交的题)

题目描述:

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出:

一个整数.

样例输入:
6 10
样例输出:
1
//整除问题
#include<stdio.h>
bool mark[1001];
int prime[1001];
int primesize;
void init() {
	int i, j;
	primesize = 0;
	for (i = 1; i <= 1000; i++) {
		mark[i] = false;
	}
	for (i = 2; i <= 1000; i++) {
		if (mark[i] == true) continue;
		mark[i] = true;
		prime[primesize++] = i;
		for (j = i*i; j <= 1000; j += i) {
			mark[j] = true;
		}
	}
}

int main() {
	int i, j;
	int n, a;
	init();
	while (scanf("%d %d", &n, &a) != EOF) {
		int cnt[1001]; 
		int cnt2[1001];
		//先将两个表示幂指数的数组初始化为0
		for (i = 0; i < 1001; i++) {
			cnt[i] = cnt2[i] = 0;
		}
		//对n!分解质因数
		for (i = 0; i < primesize; i++) {
			int t = n;
			while (t) {
				cnt[i] += t / prime[i];
				t = t / prime[i];
			}
		}
		//对a分解质因数
		int ans = 123123123;//定义一个超级大的数作为比较的基准
		for (i = 0; i < primesize; i++) {
			if (a%prime[i] == 0) {
				while (a%prime[i] == 0) {
					cnt2[i]++;
					a = a / prime[i];
				}
				if (cnt[i] / cnt2[i] < ans) {
					ans = cnt[i] / cnt2[i];
				}
			}
		}
		printf("%d\n", ans);
	}
	
}
九度1087 约数的个数

题目描述:

输入n个整数,依次输出每个数的约数的个数

输入:

输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。

输出:

可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。

样例输入:
5
1 3 4 6 12
样例输出:
1
2
3
4
6
       
//约数的个数
#include<stdio.h>
#include<math.h>
int count(int x) {
	int i;
	int ans=0;
	for (i = 1; i <= sqrt(x); i++) {
		if (x%i == 0) {  //因数是对称的
			ans += 2;
		}
		if (i*i == x) {  
			ans--;
		}
	}
	return ans;
}
int main() {
	int n;
	int i, j;
	int a[1001];
	while (scanf("%d", &n) != EOF) {
		for (i = 0; i < n; i++) {
			scanf("%d", &a[i]);
		}
		for (i = 0; i < n; i++) {
			printf("%d\n", count(a[i]));
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值