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

开始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
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 3楼 rjsp
我想输出的:
9=3^2
18=2*3^2
书上习题,这个用递归写是不是会很麻烦
2015-11-05 14:10
令狐少侠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
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 12楼 TonyDeng
我后来看了书上的解析改了一下还是不行。书上就是要拿这题练习递归啊

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-11-05 20:08
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 15楼 wmf2014
谢谢美丽的版主。。。
2015-11-05 21:18
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 18楼 TonyDeng
版主这些C语言库从哪学来的。有专门的书么?
2015-11-06 09:20
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 15楼 wmf2014

现在有若个疑问:
1.
那个程序是怎么判断素数的,我试画了9,15运行流程图还不知道原因
是通过这句筛选么,for(i=j;(i*i<=n)&&(n%i);i++);怎么判断的?
2.
这里由于递归函数并未放在for循环内部,并且是尾递归,那么运行到递归出口后返回上一层,
不会执行任何语句,一直返回直到第一次调用,整个递归函数结束。所以这里递归函数返回没有可能
改变数组中数据。。。。。这算不算是一个技巧。。
2015-11-06 11:29
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 20楼 TonyDeng
不明觉厉。。。
2015-11-06 11:30
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
收藏
得分:0 
回复 25楼 TonyDeng
两个版主都强。。。。。
2015-11-06 16:48
快速回复:学习日记三:素因子分解,撸了一个上午
数据加载中...
 
   



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

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