BASIC-16 分解质因数

求出区间[a,b]中所有整数的质因数分解。

提示

先筛出所有素数,然后再分解。

数据规模和约定

2<=a<=b<=10000

【输入形式】
 输入两个整数a,b。
【输出形式】

每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)

【样例输入】

3 10

【样例输出】

3=3
4=2* 2
5=5
6=2* 3
7=7
8=2* 2* 2
9=3* 3
10=2* 5

代码如下:

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

bool primer(int n) {
    
    //判断n是否为素数
	if(n == 2)
		return 1;
	for (int i = 2;i <= sqrt(n);i++) {
    
    
		if (n % i == 0)
			return 0;
	}
	return 1;
}

void print_ans(vector<int> ans,int a) {
    
    //输出
	int t = ans.size()-1;
	cout << a << "=";
	for (unsigned int i = 0; i < ans.size(); i++) {
    
    
		cout << ans[i];
		if (t-- > 0)
			cout << "*";
	}
	cout << endl;
}

void judge(int a, int b) {
    
    
	vector<int> arr;
	vector<int> ans;
	for (int i = 2; i <= b;i++) {
    
    //将区间[2,b]中的素数存入arr中;
		if (primer(i))
			arr.push_back(i);
	}
	while (a <= b) {
    
    //遍历a到b
		bool temp = primer(a);
			if (temp) {
    
    //如果当前a是素数,直接输出;
				cout << a << "=" << a<<endl;
				a++;
				continue;
			}
		if (!temp) {
    
    
			unsigned int i = 0,t = a;
			while ( i < arr.size()) {
    
    
				if (t != 1) {
    
    
					if (t % arr[i] == 0)//如果t对arr[i]求余等于0,说明arr[i]是一个质因数,将arr[i]存入ans中,并令t/=arr[i];
						ans.push_back(arr[i]), t /= arr[i];
					else
						i++;//否则判断arr[i+1]是不是质因数;
				}
				else {
    
    //当t==1时,说明所有质因数判断完毕,然后输出;
					print_ans(ans, a);
					ans.clear();
					break;
				}
			}
		}
		a++;
	}

}

int main() {
    
    
	int a, b;
	cin >> a >> b;
	judge(a, b);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sgsx11/article/details/114761529
今日推荐