题目大意:给出n的质因数分解式,求n-1的质因数的分解式。比如第二组sample,就是5^1*2^1=10, 求10-1即9的质因数分解,从大到小输出,即3^2.本来很简单的嘿,直接最暴力最裸的就行了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
/**
* 2 2 3 17
2 2 3 29
2 2 5 37
*/
using namespace std;
const int maxn = 100002;
int su[100002];
bool u[100002];
int num = 0;
void prepare() {//欧拉筛法产生素数表...
int i, j;
memset(u, true, sizeof(u));
for (i = 2; i <= 100002; ++i) {
if (u[i]) {
su[++num] = i;
}
for (j = 1; j <= num; ++j) {
if (i * su[j] > 100002) {
break;
}
u[i * su[j]] = false;
if (i % su[j] == 0) {
break;
}
}
}
}
//------------------------
int path[maxn];//底
int po[maxn];//指数
int cnt;//用到了多少个质因数
void solve(int n) {//对n进行质因数分解
cnt = 0;
int i;
for (i = 1; su[i] <= n && n != 1; ++i) {
int ct = 0;
while (n % su[i] == 0) {
ct++;
n /= su[i];
}
if (ct != 0) {
path[cnt] = su[i];
po[cnt++] = ct;
}
}
for (i = cnt - 1; i >= 0; --i) {//输出分解完的式子
if (i != 0) {
printf("%d %d ", path[i], po[i]);
} else {
printf("%d %d\n", path[i], po[i]);
}
}
}
int main() {
/**
* ****特别要注意这种格式数据的处理...
* 17 1
5 1 2 1
509 1 59 1
0
*/
prepare();
int a, b, num1;
char ch;
while (scanf("%d", &a) != EOF, a) {
scanf("%d%c", &b, &ch);
num1 = 1;
num1 *= (int) pow(a * 1.0, b * 1.0);
while (ch != '\n') {
scanf("%d%d%c", &a, &b, &ch);
num1 *= pow(a + 0.0, b);//**这里需要注意一下
}
solve(num1 - 1);
}
return 0;
}