#include
#include
#define max 30
int a[max] ;
int b[max] ;
int expon ;
int IsPrimeNumber( int factor )
{
int k ;
int m;
(int)k=sqrt(factor); //判别i是否为素数,只需使2~根号i之间的每一个整数去除 for(m=2;m<=k;m++)
if(factor%m==0) break;
if(m>k)
return 1 ;
else return 0 ;
}
/*void search(int remainder,int factor)//需要将factor的值赋给i,否则当下一个因子无法从factor开时,
{
for( factor=0 ; factor<=remainder ; factor++,expon=0,nTerm++ )
{
if( IsPrimeNumber&& )
{
expon++ ;
a[nTerm] = factor ;
b[nTerm] = expon ;
}
}
}*/
void search(int remainder , int factor ,int nTerm )//剩余值,起始因子{
/*int expon;*/ //指数,第nTerm项 int i ;
int k ;
if(/*remainder==1||*/remainder==factor)
{
a[nTerm] = factor ;
b[nTerm] = expon+1 ;
printf( "%d^%d" , a[0],b[0] ) ;
for( k=1 ; k
printf( "*%d^%d",a[k],b[k] ) ;
//如果指数为1不打印 printf( "*%d^%d\n",a[k],b[k] ) ;
return ;
}
else
{
for( i=factor ; i<=remainder ; i++,expon=0 )//递归出口可否放在循环内部 {
//如果已经是素数只能分解为自身时应该输出 if( IsPrimeNumber(i) && remainder%i==0 ) //如果i是因子且剩余值remainder能整除这个因子,保存数据 {
if(a[nTerm]!=i/*i!=factor*/) //如果因子发生变化则项数加1,没变化项数不变 nTerm++ ;
expon++ ;
a[nTerm] = factor ;
b[nTerm] = expon ;
//判断remainder/i是否为0即判断remainder是否等于i
/*if(/*remainder==1||*/remainder==factor)
/*{
a[nTerm] = factor ;
b[nTerm] = expon+1 ;
printf( "%d^%d" , a[0],b[0] ) ;
for( k=1 ; k
printf( "*%d^%d",a[k],b[k] ) ;
//如果指数为1不打印
printf( "*%d^%d\n",a[k],b[k] ) ;
return ;
}*/
search( remainder/i , i , nTerm) ;
}
else if( !IsPrimeNumber(i) ||remainder%i!=0/*&& remainder%i!=0*/ ) //如果不是素数或者无法整除,进入下一个因子的判断 {
continue ;
}
}
/*else if(remainder==1) //如果起始因子从1开始那么当整数是1时数据无法保存,故整数N=1单独考虑
{
printf( "%d^%d" , a[0],b[0] ) ;
for( k=1 ; k
printf( "*%d^%d",a[k],b[k] ) ;
//如果指数为1不打印
printf( "%d^%d\n",a[k],b[k] ) ;
return ;
}*/
}
}
int main()
{
int N;
scanf( "%d" , &N ) ;
expon=0 ; //遗漏,并改为全局变量 printf("%d=",N);
search( N , 2 , 0) ;
//如果起始因子从1开始那么当整数是1时数据无法保存,故整数N=1单独考虑
}