学习日记三:素因子分解,撸了一个上午
前天整数分解书上给了代码,自己分析一下代码感觉还是不行。于是今天想自己撸一个素因子分解,结果快吃饭了还没好,下午继续。
写递归的太少了,只有汉诺塔自己写的,其他的都看书上的也就那么几个,看懂和自己会完全不一样啊
开始expon没弄成全局变量,在纸上写了调用过程发现错了,然后发现输入20没结果分析一下原来是当输入20运行到5时remainder/i为1无法输出,现在递归出口不知道往哪里放都是错的。
再弱弱的问句,无返回值的递归函数加了return语句是结束整个递归调用过程,还是返回上一层调用函数??。。。。
程序代码:#include <stdio.h>
#include <math.h>
#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 ,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<nTerm-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
search( remainder/i , i , nTerm) ;
}
else if( !IsPrimeNumber(i) ||remainder%i!=0/*&& remainder%i!=0*/ ) //如果不是素数或者无法整除,进入下一个因子的判断
{
continue ;
}
}
}
}
int main()
{
int N;
scanf( "%d" , &N ) ;
expon=0 ; //遗漏,并改为全局变量
printf("%d=",N);
search( N , 2 , 0) ;
//如果起始因子从1开始那么当整数是1时数据无法保存,故整数N=1单独考虑
}下面是未修改的代码
程序代码:#include <stdio.h>
#include <math.h>
#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<nTerm-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<nTerm-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<nTerm-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单独考虑
}
[此贴子已经被作者于2015-11-5 11:44编辑过]









