蓝桥杯 试题 基础练习 分解质因数

资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
  求出区间[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
提示
  先筛出所有素数,然后再分解。
数据规模和约定
  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值