1089 质因数分解

质因数分解

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42987451/article/details/83549887