分解素因数
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的质因数的个数。样例输入:
题目描述:给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。输入:两个整数n(2<=n<=1000),a(2<=a<=1000)输出:一个整数.样例输入:
题目描述: 输入n个整数,依次输出每个数的约数的个数
输入: 输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出: 可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入:
例一 九度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])); } } }
相关文章推荐
- 算数基本定理——素因数分解序列生成
- 分解素因数
- HDU 5428 The Factor (素因数分解)
- 机试算法讲解:第26题 分解素因数
- Hdu 1395 2^x mod n = 1 (欧拉定理 分解素因数)
- poj 1365 Prime Land 素因数分解
- 分解素因数 九度1207 1104 1087
- 批量分解素因数(一)
- 复试训练——数学问题—— 分解素因数
- HDU-1333(分解素因数)
- poj2407Relatives(欧拉公式,素因数分解)
- 批量分解素因数(二)
- UVA - 10699 - Count the factors(分解素因数)
- HDU-1492(素因数分解_easy)
- C语言:素数筛法与分解素因数
- 素因数分解
- 分解素因数 1
- 分解素因数 2
- c语言的字符串分解——strtok函数和strsep函数
- poj1845 sumdiv 整数唯一分解,等比数列求和或逆元