Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format:
N
=
p
1
k
1
∗
p
2
k
2
∗
.
.
.
∗
p
m
k
m
N = p_1^{k_1}*p_2^{k_2}*...*p_m^{k_m}
N=p1k1∗p2k2∗...∗pmkm.
Sample Input:
97532468
Sample Output:
97532468=2^211171011291
思路:
- 考虑到 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 ∗ 23 ∗ 29 2*3*5*7*11*13*17*19*23*29 2∗3∗5∗7∗11∗13∗17∗19∗23∗29就已经超过了int范围,因此对一个int型范围的数来说,fac数组的大小只需要开到10就可以了。
- 有一个结论:对于一个正整数n来说,如果它存在[2,n]范围内的质因子,那么这些质因子全部小于等于sqrt(n),要么只存在一个大于sqrt(n)的质因子,而其余质因子全部小于等于sqrt(n)。
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 10010;
int prime[maxn];
int pNum; //素数的个数
bool isPrime(int n)
{
if (n == 1)
{
return false;
}
int s = sqrt(n);
for (int i = 2; i <= s; i++)
{
if (n % s == 0)
{
return false;
}
}
return true;
}
void Find_Prime() //求素数表
{
for (int i = 2; i < maxn; i++)
{
if (isPrime(i) == true)
{
prime[pNum++] = i;
}
}
}
struct factor
{
int x; //质因子
int cnt; //个数
} fac[10]; //对于int型范围来说,数组的大小开到10即可
int main()
{
Find_Prime();
int N;
cin >> N;
if (N == 1)
{
cout << "1=1" << endl;
}
else
{
int sqr = sqrt(N);
int num = 0;
cout << N << "=";
for (int i = 0; i < pNum && prime[i] <= sqr; i++)
{
if (N % prime[i] == 0)
{
fac[num].x = i;
fac[num].cnt = 0;
while (N % prime[i] == 0)
{
fac[num].x = prime[i];
fac[num].cnt++;
N /= prime[i];
}
num++; //不同质因子个数加一
}
if (N == 1)
{
break;
}
}
if (N > 1) //如果无法被根号n以内的质因子除尽,那么一定有一个大于根号n的质因子
{
fac[num].x = N;
fac[num].cnt = 1;
num++;
}
for (int i = 0; i < num; i++)
{
if (i == num - 1)
{
if (fac[i].cnt > 1)
{
cout << fac[i].x << "^" << fac[i].cnt << endl;
}
else
{
cout << fac[i].x << endl;
}
}
else
{
if (fac[i].cnt > 1)
{
cout << fac[i].x << "^" << fac[i].cnt << "*";
}
else
{
cout << fac[i].x << "*";
}
}
}
}
return 0;
}
- 题目来源:codeup 问题C:质因数的个数
题目描述
求正整数N(N>1)的质因数的个数。
相同的质因数需要重复计算。如120=22235,共有5个质因数。
输入
可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。
输出
对于每组数据,输出N的质因数的个数。
样例输入
120
200
样例输出
5
5
提示
注意1不是N的质因数;若N为质数,N是N的质因数。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int num = 0;
for (int i = 2; i <= sqrt(n); i++)
{
while (n % i == 0)
{
num++;
n /= i;
}
if (n == 1) //及时退出循环,节省时间
{
break;
}
}
if (n > 1)
{
num++;
}
cout << num << endl;
}
return 0;
}
- 题目来源:codeup 约数的个数
题目描述
输入n个整数,依次输出每个数的约数的个数。
输入
输入的第一行为N,即数组的个数(N<=1000)
接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000)
当N=0时输入结束。
输出
可能有多组输入数据,对于每组输入数据,
输出N行,其中每一行对应上面的一个数的约数的个数。
样例输入
6
1 4 6 8 10 12
0
样例输出
1
3
4
4
4
6
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 100010;
int prime[maxn];
bool vis[maxn] = {false};
int pNum; //素数的个数
void Find_Prime() //求素数表
{
for (int i = 2; i < maxn; i++)
{
if (vis[i] == false)
{
prime[pNum++] = i;
for (int j = i; j < maxn; j += i)
{
vis[j] = true;
}
}
}
}
struct factor
{
int x; //质因子
int cnt; //个数
} fac[10]; //对于int型范围来说,数组的大小开到10即可
int main()
{
Find_Prime();
int n;
while (scanf("%d", &n) && n)
{
while (n--)
{
int x;
scanf("%d", &x);
int sqr = sqrt(x);
int num = 0;
for (int i = 0; i < pNum && prime[i] <= sqr; i++)
{
if (x % prime[i] == 0)
{
fac[num].x = i;
fac[num].cnt = 0;
while (x % prime[i] == 0)
{
fac[num].x = prime[i];
fac[num].cnt++;
x /= prime[i];
}
num++; //不同质因子个数加一
}
if (x == 1)
{
break;
}
}
if (x > 1) //如果无法被根号n以内的质因子除尽,那么一定有一个大于根号n的质因子
{
fac[num].x = x;
fac[num].cnt = 1;
num++;
}
int sum = 1;
for (int i = 0; i < num; i++)
{
sum *= (fac[i].cnt + 1);
}
printf("%d\n",sum);
}
}
return 0;
}