新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 荤菜求助:求n! 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6180 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 荤菜求助:求n! 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     荤菜 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:66
      积分:295
      门派:XML.ORG.CN
      注册:2007/2/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给荤菜发送一个短消息 把荤菜加入好友 查看荤菜的个人资料 搜索荤菜在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看荤菜的博客楼主
    发贴心情 荤菜求助:求n!

    求n!
    long ff(int n)
    {
        long f;
        if(n<0) printf("n<0,input error");
        else if(n==0||n==1) f=1;
        else f=ff(n-1)*n;
        return(f);
    }
    main()
    {
        int n;
        long y;
        printf("\ninput a inteager number:\n");
        scanf("%d",&n);
        y=ff(n);
        printf("%d!=%ld",n,y);
    getch();}
    }
    /*输入4结果正确*/
    改成程序2
    long ff(int n)
    {
        long f;
        if(n>1)

         f=ff(n-1)*n;
        return(f);
    }
    main()
    {
        int n;
        long y;
        printf("\ninput a inteager number:\n");
        scanf("%d",&n);
        y=ff(n);
        printf("%d!=%ld",n,y);
    getch();}
    /*4!居然是0*/
    再改成程序3
    long ff(int n)
    {

        if(n>1)

         n=ff(n-1)*n;
        return(n);
    }
    main()
    {
        int n;
        long y;
        printf("\ninput a inteager number:\n");
        scanf("%d",&n);
        y=ff(n);
        printf("%d!=%ld",n,y);
    getch();}
    /*结果又正确*/
    程序2我假设输入的数都大于1,现在输入4,结果却等于0,程序3和程序2相比改了两处,1。把long f;去掉,2。把f改成n,结果结果却奇迹般的正确了,为什么程序1和程序3对了,而程序2错了呢?


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/10 17:43:00
     
     girlstop 帅哥哟,离线,有人找我吗?射手座1982-12-21
      
      
      等级:大一(猛啃高等数学)
      文章:15
      积分:182
      门派:IEEE.ORG.CN
      注册:2006/5/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给girlstop发送一个短消息 把girlstop加入好友 查看girlstop的个人资料 搜索girlstop在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看girlstop的博客2
    发贴心情 
    程序2有个问题。n=2时,f=ff(1)*2。
    但是ff(1)的时候,if语句不执行,直接返回f,f缺省为0.所以ff(1)=0

    程序3之所以正确是因为求ff(1)的时候,虽然if语句不能执行,但是return(n)返回1.所以ff(1)=1

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/10 21:12:00
     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客3
    发贴心情 
    对于求阶乘的算法来说,只有程序1是正确的,程序2 和三都是不对的,首先程序2、3都都没有考虑当数字等于0 1 的时候。
    而当输入数值等于4的时候之所以出现你说的那种情况,是应为在程序2中你使用了一个未初始化的变量来作为返回值,这个函数使用了一个递归,下一步的返回值是用来作为当前步的乘数来进行计算的。当n=1的时候,f不参与计算,而又未进行初始化,这时候f默认值是一个随机的无限大的值。导致了计算结果的错误。而当你使用程序三的时候,它返回的是n的值,这恰好等于1的阶乘,结算结果就正确了。

    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/11 9:10:00
     
     荤菜 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:66
      积分:295
      门派:XML.ORG.CN
      注册:2007/2/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给荤菜发送一个短消息 把荤菜加入好友 查看荤菜的个人资料 搜索荤菜在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看荤菜的博客4
    发贴心情 
    谢谢各位,我明白了。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/4/12 13:57:00
     
     lixiaoting 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:8
      积分:86
      门派:XML.ORG.CN
      注册:2007/7/29

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lixiaoting发送一个短消息 把lixiaoting加入好友 查看lixiaoting的个人资料 搜索lixiaoting在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lixiaoting的博客5
    发贴心情 
    #include<stdio.h>
    #include<conio.h>
    long ff(int n)
    {
        long f;
        if(n==1||n==0)f=1;
        if(n>1)f=ff(n-1)*n;
        return(f);
    }
    main()
    {
        int n;
        long y;
        printf("\ninput a inteager number:\n");
        scanf("%d",&n);
        y=ff(n);
        printf("%d!=%ld",n,y);
    getch();}
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/7/29 15:34:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 0:51:04

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms