任意正合数都可以表示为素因子的积,也称为整数的素因子分解。如果素因子按升序排列,则这种表示方式是唯一的。例如:420=2*2*3*5*7。
输入格式:
第一行有一个正整数n,表示其后需要处理n个整数。 其后的每行有一个正整数k,(2<k<=10000)。
输出格式:
每个整数的分解为素因子乘积形式,素因子按升序排列,每个结果输出一行,形如 XXXX=XXXXXX。 如果该数为素数则输出XXXX=XXXX。
4
12
13
105
420
结尾无空行
输出样例:
12=2*2*3
13=13
105=3*5*7
420=2*2*3*5*7
结尾无空行
思路:先写一个函数用于求出 (1,k) 的素数表a[],再写一个函数判断该数是否为素数。
从素数表的第一个数a[0]开始除k,如果除得尽k=k/a[0] ,除不尽就找素数表的下一个数
#include<stdio.h>
int isprime(int a) {//判断素数。
int i, flag = 1;
for (i = 2; i < a; i++) {
if (a % i == 0) {
flag = 0;
break;
}
}
return flag;
}
void primelist(int a[], int n) {//求出素数表,并存入数组中。
int i, j = 0;
for (i = 2; i < n; i++) {
if (isprime(i)) {
a[j] = i;
j++;
}
}
}
int main() {
int i, n, j, k, a[1000], b;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d", &b);
if (isprime(b)) {//判断给出的数是否为素数
printf("%d = %d\n", b, b);
}
else {
printf("%d = ", b);
primelist(a, b);//求出该数的素数表
j = 0;
while (b != 1)//当b被整除为1时,代表循环结束
{
if (b % a[j] == 0) {//判断b是否能整除于a[j],
printf("%d", a[j]);
b /= a[j];
if (b != 1)//当b==1时,说明式子已表达完毕,无需再加*号
printf(" * ");
}
else {
j++;//判断素数表的下一个素数
}
}
printf("\n");
}
}
return 0;
}