资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
求出区间[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
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
思路:
1.找出2~b内所有素数
2.如果当前数是素数,输出;如果不是,在素数数组中早最小的,能被当前数整除的素数
3.递归进行上诉2操作,直到最后当前数可以在素数数组中找到为止
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
using namespace std;
bool IsPrime(int num){//判断是否为素数:采用6x-1和6x+1方法,即所有素数必须被6i-1或者6i+1整除
if(num==2 || num==3)return true;
if((num+1)%6!=0&&(num-1)%6!=0)return false;
int tmp = sqrt(num);//能够被因式分解,分解得到的因式肯定小于等于num开方
for(int i=5;i<=tmp;i+=6){//在6i-1,6i,6i+1,6i+2,6i+3,6i+4这个循环中,因为即使能被6i-1,6i+1整除,也可能不是素数
//所以当能被6i-1或者6i+1整除时,肯定为奇数,所以6i,6i+2,6i+4都不可能整除,6i+3能被
//3整除,但是6i-1,6i+1肯定不能被3整除,所以num应该不可能被6i+3整除,所以如果num不时
//素数,只能被6i-1或者6i+1整除
if(num%i==0||num%(i+2)==0)return false;
}
return true;
}
string Devide(int num,vector<int>& prime){
if(!prime.empty()&&find(prime.begin(),prime.end(),num)!=prime.end()){
string res = "";
res.append(1,'*');//将数字转换成字符串
stringstream ss;
ss<<num;
res+=ss.str();
return res;
}else{
string res="";
int i=0;
int len = prime.size();
while(i<len){
if(num%prime[i]==0)break;
++i;
}
if(i<len)
{
num = num/prime[i];
res.append(1,'*');
stringstream ss;
ss<<prime[i];
res+=ss.str();
res+=Devide(num,prime);//采用递归的方法
}
else{
res.append(1,'*');
stringstream ss;
ss<<num;
res+=ss.str();
}
return res;
}
}
void DevideNum(int num,vector<int> &prime){
if(!prime.empty()&&find(prime.begin(),prime.end(),num)!=prime.end()){
cout<<num<<"="<<num<<endl;
}else{
string res = Devide(num,prime);
//string res = Devide(4,prime);
if(res[0]=='*')
res.erase(0,1);
cout<<num<<"="<<res<<endl;
}
}
int main(){
int a,b;
cin>>a>>b;
vector<int>prime;
int i,j;
for(i=2;i<b;i++){
if(IsPrime(i))prime.push_back(i);
}
for(i=a;i<=b;++i)
DevideNum(i,prime);
return 0;
}