对一个数分解质因数,使得其满足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]));
}
}
}