| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2803 人关注过本帖
标题:学习日记三:素因子分解,撸了一个上午
只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
已结贴  问题点数:40 回复次数:27 
学习日记三:素因子分解,撸了一个上午
前天整数分解书上给了代码,自己分析一下代码感觉还是不行。
于是今天想自己撸一个素因子分解,结果快吃饭了还没好,下午继续。
写递归的太少了,只有汉诺塔自己写的,其他的都看书上的也就那么几个,看懂和自己会完全不一样啊

开始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编辑过]

搜索更多相关主题的帖子: return 日记 
2015-11-05 11:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
分解質因數用遞歸衹會把問題弄複雜,根本就不需要在這上面鑽牛角尖,非遞歸算法比遞歸清晰簡明得多。很多所謂的技術,其實是自己製造麻煩去解決而獲得心理滿足的。走入困境的時候,其實第一時間考慮的是不是走錯了路,而不是非要走通不可。

[此贴子已经被作者于2015-11-5 11:50编辑过]


授人以渔,不授人以鱼。
2015-11-05 11:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:10 
运行了一下楼主的代码,输出的东西乱七八糟看不懂,不知道楼主想要什么输出效果。
我顺手写一个吧:
程序代码:
#include <stdio.h>

void foo( unsigned n )
{
    for( unsigned i=2; i<=n; n%i==0?n/=i:++i )
    {
        if( n%i == 0 )
            printf( "*%u", i );
    }
}

int main( void )
{
    foo( 180 ); // 2*2*3*3*5
    return 0;
}

2015-11-05 12:56
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 3楼 rjsp
我想输出的:
9=3^2
18=2*3^2
书上习题,这个用递归写是不是会很麻烦
2015-11-05 14:10
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:10 
想要什么输出效果
2015-11-05 14:15
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 5楼 tlliqi
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-11-05 14:30
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 2楼 TonyDeng
我是想借这题练习递归的。。。。
2015-11-05 14:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用令狐少侠56在2015-11-5 14:31:49的发言:

我是想借这题练习递归的。。。。

換另一種遞歸思路唄。其實遞歸和非遞歸都是一樣的數據結構。

授人以渔,不授人以鱼。
2015-11-05 14:38
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
递归的代码如下,仅供参考:
程序代码:
#include<stdio.h>
void ff(int n,int a[],int l)
{//分解质因数,质因数都存储在数组a中
    int i;
    for(i=2;(i*i<=n)&&(n%i);i++);
    if(i*i>n)a[l]=n;
    else
    {
        a[l]=i;
        ff(n/i,a,++l);
    }
}
int main()
{
    int i,n,a[20]={0};
    scanf("%d",&n);
    ff(n,a,0);
    for(i=0;a[i];i++)printf("%d*",a[i]);
    printf("\n");
    return 0;
}


[此贴子已经被作者于2015-11-5 16:39编辑过]


能编个毛线衣吗?
2015-11-05 16:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
long int,誰知道你平臺的long int有多大,遞歸?

授人以渔,不授人以鱼。
2015-11-05 16:21
快速回复:学习日记三:素因子分解,撸了一个上午
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020246 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved