蒜头君有一个数,请你输出其素因子分解表达式。
输入格式
输入一个整数 n (2≤n≤100)。
输出格式
输出该整数的因子分解表达式,表达式中各个素数从小到大排列。
如果该整数可以分解出因子 aa 的 bb 次方:当 bb 大于 11 时,写做a^b
;当 bb 等于 11 时,则直接写成a
。
因为n的取值2~100所以我们找质数不需要太大
void ss() {
for (int i = 2; i <= 105; i++) {
if (x[i]) {
continue;
}
for (int j = i + i; j <= 105; j += i) {
x[j] = 1;
}
}
}
首先如果它本身就是质数,那它就没有别的可能输出自身就可以
if (x[n] == 0) {
printf("%d", n);
return 0;
}
因为它表达式中各素数从小到大排列,所以我们应该记录它的最大质数
int imax = 0;
if (imax < i) {
imax = i;
}
从头早到后面再回来
if (i > n) {
i = 2;
}
那么这样我们就可以得到结果了
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int x[105] = {1, 1};
int x2[105];
void ss() {
for (int i = 2; i <= 105; i++) {
if (x[i]) {
continue;
}
for (int j = i + i; j <= 105; j += i) {
x[j] = 1;
}
}
}
int main() {
int n;
scanf("%d", &n);
ss();
int res;
int i = 1;
int anx = 0;
int imax = 0;
if (x[n] == 0) {
printf("%d", n);
return 0;
}
while (n) {
i++;
if (x[i]) {
continue;
}
if (i > n) {
i = 2;
}
res = n % i;
if (res) {
continue;
}
n = n / i;
x2[i]++;
if (x[n] == 0) {
if (i < n) {
i = n; //如果我们除过后就是一个质数,那我们就可以得到答案了,但我们要记
录最大质数所以要比较一下
}
x2[n]++;
n = 0;
}
if (imax < i) {
imax = i; //用来记录最大质数为多少
}
}
for (int j = 2; j <= imax; j++) {
if (x[j] || x2[j] == 0) {
continue;
}
if (anx == 0) {
if (x2[j] == 1) {
printf("%d", j);
} else {
printf("%d^%d", j, x2[j]);
}
anx = 1;
} else if (x2[j] == 1) {
printf("*%d", j);
} else {
printf("*%d^%d", j, x2[j]);
}
}
return 0;
}