质因子分解:输入一个整数n,输出它拆成质因子乘积的形式。例如:30=2*3*5;
知识点:一个数的质因子,若有大于sqrt(n)的,那么只有一个,因为有两个大于sqrt(n)的质因子的话就超过n了。
思路:
先将sqrt(n)内的素数放到数组里面。遍历素数表,判断是否是该数的因子,若是,通过相除判断有几个。若只有小于sqrt(n)的素因子,则相除后剩余1。例如,12=2*2*3; 12/2=6;6/2=3;3/3=1。否则,相除后剩的是大的素因子,例如,
15=3*5; 15/3=5; 素数表里面只到sqrt(15)<5,最后的大的素因子就是相除后的结果5。
求素数表使用的是欧拉筛法,详见:素数筛选-埃氏筛法与欧拉筛法
代码:
/*
质因子分解:输入一个整数n,输出它拆成质因子乘积的形式。例如:30=2*3*5;
知识点:一个数的质因子,若有大于sqrt(n)的,那么只有一个,因为有两个大于sqrt(n)的质因子的话就超过n了。
Project: Prime_Factor
Date: 2019/03/02
Author: Frank Yu
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<set>
#include<list>
#include<vector>
#include<map>
#include<stack>
#include<iterator>
#include<algorithm>
#include<iostream>
#define F(i,m,n) for(int i=m;i<n;i++)
using namespace std;
typedef struct factor
{
int f, cnt;//质因子 个数
};
int prime[1000001];//存素数
bool vis[1000001];//标记非素数,true表示非素数,即合数
int psize = 0;//已知素数个数
void oula(int n)
{
memset(vis, false, sizeof(vis));//初始化
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= n; i++)
{
if (!vis[i])//是素数
prime[psize++] = i;//保存素数
//cout << "i:" << i << endl;
for (int j = 0; j<psize && i*prime[j] <= n; j++)
{
//cout << "j:" << j << "\t" << "prime[j]:" << prime[j] << "\t" << "i*prime[j]:" << i*prime[j] << endl;
vis[i*prime[j]] = true;//找到的素数的倍数不访问
if (i % prime[j] == 0) break;//相对埃氏筛法的优化,保证合数仅被最小质因子标记一次!
}
}
}
//主函数
int main()
{
int n,num;
factor fac[10];//前十个素数相乘已到int
F(i,0,10)//初始化
{
fac[i].f = 0;
}
num = 0;//记录质因子下标
cin >> n;
int temp = n;
int bound = sqrt(n)+1;
oula(bound);//生成素数表
for(int i=0;;i++)//找到2-sqrt(n)内的质因子
{
if (prime[i]==0)break;//没有sqrt(n)内的质因子
if (n%prime[i]==0)//是质因子
{
fac[num].f = prime[i];
fac[num].cnt = 0;
while (n%prime[i] == 0)//质因子重复个数
{
fac[num].cnt++;
n /= prime[i];
}
num++;
}
}
if (n != 1)//sqrt(n)内没有找到质因子本身是质数,或剩余的大于sqrt(n)的一个质因子
{
fac[num].f = n;
fac[num++].cnt = 1;
}
printf("%d=",temp);
bool flag = false;//第一个质因子是否输出
F(i, 0, 10)
{
if (fac[i].f)//是质因子
{
while (fac[i].cnt--)
{
if (flag)
{
printf("*%d", fac[i].f);
}
else
{
flag = true;
printf("%d", fac[i].f);
}
}
}
}
printf("\n");
return 0;
}
更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。