质因数分解
1、题目内容
Description
任意一个正整数可以分解成唯一的质因数的乘积,给出正整数,请计算出它的质因数分解式。
输入
每行一个正整数2<=n<=10^8。
输出
每行输出一个对应结果。使用”^”表示幂,”*”表示乘,质因子应该按从小到大的顺序输出,如果某一个质因子只有一次,那么就不要输出它的幂。
Sample Input
2
6
36
Sample Output
2
2*3
2^ 2 * 3^2
2、题目分析
寻找质因数,难处在寻找区间的确立以及输出格式的控制上,首先,在哪个区间内去寻找质因数呢,比较容易想到是区间【2,n】但是这会超时,我们寻找质因子的范围其实不必要这么大,只要寻找到【2,sqrt(n)】这个区间就好了,因为如果n存在多个质因数的话最大的那个质因数是肯定不会超过n/2的,仔细分析,也不会超过sqrt(n)。 另外就是输出格式控制的问题,要考虑到第一个质因数和其它质因数输出时的区别,还要考虑到质因数的指数大于1的输出问题。综合这两方面的考虑,这个题就能解决了。
3、参考代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,count;
int t=sqrt(n); //比较到开平方后的数就行,不然就会超时
int flag=0; //标记变量,用于标记是否找到第一个因子
for(i=2;i<=t;i++) //区间内寻找n的因子
{
if(n%i==0) //找到因子后,需要开始计算这个因子的次数
{
count=0; //计数器变量,记录因子的幂次
while(n%i==0) //求指数幂的一个循环
{
n/=i;
count++;
}
//下面这个判断语句主要是考虑到第一的因子的输出问题,若找到了第一个因子,则
//直接输出数据,而接下来的因子则要以*因子的形式输出
if(flag==0)
{
printf("%d",i);
flag=1;
}
else
{
printf("*%d",i);
}
if(count>1) printf("^%d",count);//输出指数幂
}
}
if(flag==0) //在区间内没有找到因子的话那么这个数是一个质因子
{
printf("%d",n);
}
else if(n!=1) //如果循环后n还没为1,那么循环后的 n也是它的质因子
{
printf("*%d",n);
}
printf("\n");
}
return 0;
}