题目
求出区间[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
解题思路
对每一个在[a,b]区间内的数进行遍历,并进行分解,分解的函数中采用递归的思想:如果是素数,将不分解;如果不是素数,将会先找到一对因子,再对每一个因子进行继续判断是否是素数、分解,直到每一个因子都是素数则递归结束。
类似题目: 蓝桥杯题目 1563: 质因数
难点
递归,仍然是明确两个问题:
- 什么工作需要重复去做——对输入进行判断是否是素数,如果不是则分解,并对它们进行判断是否是素数,如果不是则继续分解……
- 做到什么时候停止重复——如果当前数/因子是素数,则停止继续判断/分解。
代码
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int a[100];
int num = 0;
void isPrime(int n){
int i,y = 1;
if (n==2)
a[num++] = n;
else
{
for (i=2;i<=sqrt(n);i++)
{
if (n%i==0)
{
y = 0;
isPrime(i);
isPrime(n/i);
break;
}
}
if (y==1)
a[num++] = n;
}
}
int cmp(const void *a, const void *b){
return *(int *)a - *(int *)b;//升序
}
int main()
{
int i,j,b1,b2;//2< =a< =b< =10000
scanf("%d %d",&b1,&b2);
for (i=b1;i<=b2;i++)
{
num = 0;
isPrime(i);
qsort(a,num,sizeof(int),cmp);
printf("%d=",i);
for (j=0;j<num;j++)
{
if (j!=0)
printf("*");
printf("%d",a[j]);
}
printf("\n");
}
return 0;
}