(蓝桥杯)分解质因数

落爺英雄遲暮 提交于 2020-02-07 18:30:56

分解质因数

问题描述

求出区间[a,b]中所有整数的质因数分解。
输入格式
  输入两个整数a,b。
输出格式
  每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=2
3
7=7
8=222
9=33
10=2
5

分析

一开始想的是先找出所有的素数,然后将这些素数一个个带入,用输入数据一次除这些素数,最后得到要求的因数。写完程序,代入系统,结果又超时了,运行超时是真的烦。本着不能浪费的原则,我这里还是贴出来看一看,毕竟能出结果的,就是慢了点,大家看看思路也还行。
质因数分解代码(超时)

#include <iostream>
using namespace std;
int k[10000];
int jj[10000];
int shuru[10000];
int main()
{
	int a,b;
	cin>>a>>b;
	for(int i=0;i<b-a+1;i++)
	{
		shuru[i]=a+i;
	}
	int n=2;
	k[0]=2;
	k[1]=3;
	//筛选出范围内所有的素数 
	for(int i=2;i<=10000;i++)
	{
		for(int j=2;j<=i/2;j++)
		{
			if(i%j==0)
			break;
			if(j==i/2&&i%j!=0)
			k[n++]=i;
		}
	}
	 for(int m=0;m<b-a+1;m++)
	{
		int d=0;
		int p=shuru[m];
		for(int j=0;j<n;j++)
		{
			for(int j=0;j<n;j++)
			if(p%k[j]==0)           //分解为素数 
			{
				jj[d]=k[j];
				p/=jj[d];
				d++;	
			}
		}
		//paixu
		int temp;
		for(int i=0;i<d;i++)
		for(int j=0;j<d-i-1;j++)
		{
		    if(jj[j]>jj[j+1])
		    {
		    	temp=jj[j];
		    	jj[j]=jj[j+1];
		    	jj[j+1]=temp;
			}
		}
		cout<<shuru[m]<<"=";
		for(int i=0;i<d;i++)
		{	
			if(i==d-1)
			{
				cout<<jj[i]<<endl;	
			}
			else
			cout<<jj[i]<<"*";
		}	
}
	return 0;
 } 

后来在网上查了查,找找思路,发现了一篇大佬写的代码,太厉害了,这里分享一下。不需要找出所有的素数,依次验证,找素数和分解因式完全可以合并在一步里面,大大缩短了运行时间,提高了效率。

//大佬的AC代码
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	for(int m=a;m<=b;m++)
	{
		int c=m;
		cout<<c<<"=";
int i=2;
while(i<=sqrt(m))
{
			if(c%i==0)
			{
				c=c/i;
				if(c>1)   //即这个数可以分解
				{
				cout<<i<<"*";		
				continue;
		     	}
		     	if(c==1) //即为分解的最后一步
		     	cout<<i<<endl;
			}
		i++;
	}
			if(c>1&&c<m)    //c是最后一个素数,直接输出
			cout<<c<<endl;   
			if(c==m)   //m本身就是素数,无法被分解
			cout<<m<<endl;
	 } 
	return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!