题目如上图
大家要是有好的思路可以放在评论区
思路一: 我想的是利用一个vector数组(可以有效判断因子个数)先来存储n的所有素数因子,然后通过另一个vector数组来进行计数,最后输出素数因子,以及其指数。
代码是用C++实现的
/*
* @Author: ZBooo
* @Date: 2021-02-05 20:17:34
* @LastEditTime: 2021-02-05 20:57:33
* @LastEditors: ZBooo
* @Description: In User Settings Edit
* @FilePath: 第十题因式分解.cpp
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool IsPrime(int &k)
{
if (k <= 1)
return false;
for (int i = 2; i * i <= k; i++)
{
if (k % i == 0)
return false;
}
return true;
}
vector<int> PrimeApart(int n)
{
vector<int> Prime;
int i = 2;
while (n != 1)
{
if (n % i == 0 && IsPrime(i))
{
Prime.push_back(i);
n /= i;
i = 2;
continue;
}
i++;
}
sort(Prime.begin(), Prime.end());
/* for (int i = 0; i < Prime.size(); i++)
{
cout << Prime[i] << " ";
}
cout << endl; */
return Prime;
}
int main()
{
int n;
cin >> n;
vector<int> Prime;
Prime = PrimeApart(n);
int Size = *(Prime.end() - 1);
vector<int> res(Size + 1, 0);
for (int i = 0; i < Prime.size(); i++)
{
res[Prime[i]]++;
}
for (int i = 0; i < res.size(); i++)
{
if (res[i] != 0)
cout << i << " ";
}
cout << endl;
for (int i = 0; i < res.size(); i++)
{
if (res[i] != 0)
cout << res[i] << " ";
}
cout << endl;
return 0;
}
思路二: 用队列实现一下,根据队列的性质LILO(先入先出),用两个队列就可以实现,一个实现存入素数因子,如果和已有的不相同就存入,一个用于存入指数,如果与前面的素数相同,就队列的back就加一。否则就存入1。这样空间复杂度低一些吧。
代码是用C++实现的 ----只写了一个分函数,根据题意应该改成
PrimeApart(int &n,queue<int> &Prime,queue<int> &Count)
然后在主函数进行调用,输入输出。
void PrimeApart(int n)
{
queue<int> Prime;
queue<int> Count;
int i = 2;
while (n != 1)
{
if (n % i == 0 && IsPrime(i))
{
if (Prime.empty())
{
Prime.push(i);
Count.push(1);
}
else
{
if (i == Prime.back())
{
Count.back()++;
}
else if (i != Prime.back())
{
Count.push(1);
Prime.push(i);
}
}
n /= i;
i = 2;
continue;
}
i++;
}
while (!Prime.empty())
{
cout << Prime.front() << " ";
Prime.pop();
}
cout << endl;
while (!Count.empty())
{
cout << Count.front() << " ";
Count.pop();
}
}