题目描述
求出区间[a,b]中所有整数的质因数分解。
提示
先筛出所有素数,然后再分解。
数据规模和约定
输入
输入两个整数a,b。
2< =a< =b< =10000
输出
每行输出一个数的分解,形如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>
using namespace std;
const int N = 10010;
bool vis[N];
int p[N];
int k = 1;void init() {for (int i = 2; i <= N; i++) {if (!vis[i]) {for (int j = i * i; j <= N; j += i)vis[j] = true;}}for (int i = 2; i <= N; i++) {if (!vis[i])p[k++] = i;}
}int main() {init();int n, m;cin >> n >> m;for (int i = n; i <= m; i++) {cout << i << "=";int j = i, cnt = 1;while (j && cnt < k) { //这里不能写成cnt<=k,会越界if (j % p[cnt] == 0) {cout << p[cnt];j = j / p[cnt];if (j != 1)cout << "*";} elsecnt++;}cout << endl;}return 0;
}
法二:
代码如下:
#include <iostream>
using namespace std;
const int N = 10010;
int k = 1;
bool vis[N];
int p[N];void init() {for (int i = 2; i <= N; i++) {if (!vis[i]) {p[k++] = i;for (int j = 2 * i; j <= N; j += i)vis[j] = true;}}
}int main() {init();int n, m;cin >> n >> m;for (int i = n; i <= m; i++) {cout << i << "=";int j = i;int cnt = 1;while (j && cnt < k) {if (j % p[cnt] == 0) {cout << p[cnt];j = j / p[cnt];if (j != 1)cout << "*";} elsecnt++;}cout << endl;}return 0;
}