基础练习——分解质因数
题目描述
求出区间[a,b]中所有整数的质因数分解。
输入
输入两个整数a,b。
输出
每行输出一个数的分解,形如k=a1*a2*a3...(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
提示
先筛出所有素数,然后再分解。
本题开始是从因数方面入手的,迟迟找不到解决口,之后突然间意识到,求的是某个数的质因数之积,果断从结果入手。
开始还糊涂地eratosthenes筛了,忘了只能作为判断条件。。
不过改过之后还是把数组元素值作为判断条件,用下标输出,完美。
不过之前因为这个原因搜了下博客,发现了和eratosthenes筛一个原理的免写了个函数的做法:
直接从2开始判断,能整除就输出,不能就+1, 当时还在疑惑这会不会把某些合数误放进去。
现在明白了,这不是和eratosthenes筛一个原理吗,只不过筛的时候是直观的一个个判断,而这里是一个整除解决所有的可能问题。
eg:
8 = 2*2*2,根本没机会见到4.
10 = 2*5
12 = 2 * 2 * 3
14 = 2 * 7
39 = 3 * 13
☆121 = 11 * 11
等一系列情况,你根本没法见到合数,或者是合数根本不是他们的因数。
所以就OK啦
贴个代码
#include<stdio.h>
#include<math.h>
void pri(int n){
int len = sqrt(n+0.5), k = 2, x = n;
printf("%d=", x);
while(k <= len){
if(x%k == 0){
x = x / k;
if(x > 1){
printf("%d*", k);
continue;
}
if(x == 1)
printf("%d\n", k);
}
k++;
}
if(x > 1 && x <= n)
printf("%d\n", x);
}
int main()
{
int n, c, d;
scanf("%d %d", &c, &d);
for(n = c; n <= d; n++){
pri(n);
}
return 0;
}