您的位置:首页 > 其它

分解素因数

2018-03-07 20:34 387 查看
对一个数分解质因数,使得其满足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]));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: