数论--质因子分解
程序员文章站
2022-06-07 16:53:48
...
Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format: .
Sample Input:
97532468
Sample Output:
97532468=2^211171011291
思路:
- 考虑到就已经超过了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;
}
推荐阅读
-
Python实现的质因式分解算法示例
-
素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码
-
2020牛客寒假算法基础集训营6 E - 立方数(质因子,思维)
-
CodeForces - 1114C Trailing Loves (or L'oeufs?) (质因子,阶乘分解)
-
L - Non-Prime Factors (质数筛选+因子分解)
-
【代码超详解】洛谷 P2043 质因子分解(分解质因数)
-
Contest100000592 - 《算法笔记》5.5小节——数学问题->质因子分解
-
手撕代码3-求一个数的质因子
-
口算训练(分解质因子+小思路)
-
用质因子去分解质因数