分解质因数
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
分析
一开始想的是先找出所有的素数,然后将这些素数一个个带入,用输入数据一次除这些素数,最后得到要求的因数。写完程序,代入系统,结果又超时了,运行超时是真的烦。本着不能浪费的原则,我这里还是贴出来看一看,毕竟能出结果的,就是慢了点,大家看看思路也还行。
质因数分解代码(超时)
#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;
}
来源:CSDN
作者:X__ING
链接:https://blog.csdn.net/X__ING/article/details/104209950