10 分解质因数
作者: Turbo时间限制: 1S章节: 基本练习(循环)
问题描述 :
求出区间[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
代码:
/*
1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * ()
T10 分解质因数
*/
#include<stdio.h>
#include<math.h>
#define MAX_SIZE 10005
int isPrime[MAX_SIZE] = {0};// 素数表,isPrime[i]= 1标记i是素数
void createPrimeTable();
int main() {
int temp = 0, flag = 0;
int i = 0, j = 0, k = 0;
int a = 0, b = 0;
createPrimeTable();
scanf("%d%d", &a, &b);
for (i = a; i <= b; i++) {
printf("%d", i);
flag = 0;
for (j = 2; j <= sqrt(i); j++) {// 寻找质因数
if (isPrime[j] == 1 && i % j == 0) {
flag = 1;
printf("=%d", j);
temp = i / j;
if (isPrime[temp]) {// 已经分解完了,结束
printf("*%d", temp);
break;
}
while (isPrime[temp] == 0) {// 分解
for (k = j; k <= sqrt(temp); k++) {
if (isPrime[k] == 1 && temp % k == 0) {
printf("*%d", k);
temp = temp / k;
break;
}
}
}
if (isPrime[temp])// 处理尾部
printf("*%d", temp);
break;
}
}
if (!flag)
printf("=%d", i);
printf("\n");
}
return 0;
}
// 建立素数表
void createPrimeTable() {
int i = 0, j = 0;
for (j = 0; j < MAX_SIZE; j++)// 初始时标记全为素数
isPrime[j] = 1;
i = 2;
while (i < MAX_SIZE - 1) {
if (isPrime[i]) {
for (j = 2; i * j < MAX_SIZE; j++) {
isPrime[i * j] = 0;
}
}
i++;
}
}
害,看到其他大佬的写法,我这代码是真滴low
优化思路及代码:
/*
1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * ()
T10 分解质因数-进阶版
利用一个原理,每一个大于2的非素数都可以表示成素数乘积的形式,
而且这些素数都是比该非素数小的
*/
/*
1 2 3 4 5 6 7 8 9 0 ! @ # $ % ^ & * ()
T10 分解质因数-进阶版
利用一个原理,每一个大于2的非素数都可以表示成素数乘积的形式,
而且这些素数都是比该非素数小的
*/
#include<stdio.h>
int main() {
int temp = 0;
int i = 0, j = 0;
int a = 0, b = 0;
scanf("%d%d", &a, &b);
for (i = a; i <= b; i++) {
printf("%d=", i);
temp = i;
// 检查每个数是否为i的因数,从最小的素数2开始。为什么这里能保证
// 输出的每个数都是素数呢?假设输出的某个因数不是素数,由于每个非素数
// 都能被其他比它小的素数整除,所以该因数一定能被前面比它小的素数整除,
// 而前面比它小的素数都已经处理过了,所以假设不成立
// 比如某个因数是14,而14=2*7,能走到14,说明前面的2和7已经判断过了,
// 所以14是不会输出的
j = 2;
while (temp != j) {
if (temp % j == 0) {// 是因数,输出
printf("%d*", j);
temp /= j;
}
else // 找下一个不同的因数
j++;
}
printf("%d", temp);
printf("\n");
}
return 0;
}
简洁多了