学习日记三:素因子分解,撸了一个上午
前天整数分解书上给了代码,自己分析一下代码感觉还是不行。于是今天想自己撸一个素因子分解,结果快吃饭了还没好,下午继续。
写递归的太少了,只有汉诺塔自己写的,其他的都看书上的也就那么几个,看懂和自己会完全不一样啊
开始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编辑过]