质因子分解

  质因子分解:输入一个整数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;
}

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值