| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3463 人关注过本帖
标题:求助,C语言编写求值1!+3!+5!....+n!
只看楼主 加入收藏
kimteahee
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-8-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:38 
求助,C语言编写求值1!+3!+5!....+n!
RT~~希望高手帮助,本人刚学
搜索更多相关主题的帖子: C语言 求值 编写 
2009-08-06 09:48
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:0 
1.输入n;
2.用两个变量分别表示阶乘的值与当前的和;
3.依次计算1!,3!,5!,...,n!,每次同时计算相应的和;
4.输出最终的和。
2009-08-06 11:31
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
我感觉,这里最核心的应该是怎么处理溢出。

估计超过20的阶乘和,64位int都溢出。

别告诉我你用double.谢谢。

生命不熄,战斗不止.
2009-08-06 11:35
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:20 
参考代码:
程序代码:
/**Step 2**/
int i,n,fact=1,sum=1;
/**Step 1**/
scanf("%d",&n);
/**Step 3**/
if(n>1)
  for(i=2;i<=n;i=i+2)
  {
     fact=fact*i*(i+1);
     sum+=fact;
  }
/**Step 4**/
printf("%d",sum);

具体要求自己完善:
如检查输入是否奇数,是否太大等......
2009-08-06 11:40
liumang_D
Rank: 2
来 自:计算机
等 级:论坛游民
威 望:1
帖 子:89
专家分:50
注 册:2008-10-20
收藏
得分:0 
基本阶乘函数:
程序代码:
long int factorial(long int n) 
{ 
    if(n == 0){ 
        return 1; 
    } 
     
    if(n > 0){ 
        return n * factorial(n - 1); 
    } 
}
注意n值不能太大 !

main函数就自己写了吧!
2009-08-06 11:46
CrystalFan
Rank: 8Rank: 8
来 自:江苏南京
等 级:蝙蝠侠
帖 子:187
专家分:802
注 册:2009-7-30
收藏
得分:0 
想的挺深啊。
要越界的它始终要越界。
两种方法:
1.用long型,再不行用double型(最终还会越界);
2.用高精度计算,乘法的高精度计算参见

https://hi.bccn.net/space-385764-do-thread-id-211.html

再写一个加法的高精度计算HighAdd()就可以了

[ 本帖最后由 CrystalFan 于 2009-8-6 11:56 编辑 ]
2009-08-06 11:51
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
回复 6楼 CrystalFan

BlueGuy写的比你的好太多了。

生命不熄,战斗不止.
2009-08-06 13:11
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
由这题想到了n的阶乘..
拆解并分析了一下燕子的关于n的阶乘的算法,要不分开还真不是人看的...
是不是高手非要这么写才显出自己的水平啊?
#include<stdio.h>
#define N 1000    //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0,p=10000;
int main()//雨中飞燕之作
{
    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
        s[a]=(b+=s[a]*t)%p,b/=p;
    for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
    return 0;
}


下面是被我拆开了的,应该容易看明白了..
#include <stdio.h>
#include <stdlib.h>
 
#define N 1000    //要计算的N
 
long s[N]={1,1},n=N,t=2,a=1,b=0,p=10000;
int temp;
 
int main()//雨中飞燕之作之拆解版
{
    for(;;)
       {
        b+=s[a]*t;
        s[a]=b%p;
        b/=p;
        if((*s==a)&&b)
          (*s)++;
        ++a;
        if(a>*s)
          if(++t<=n) {b=0;a=1;}
            else break;
       }
    printf("%d",s[*s]);
    for(;--*s>0;)
       printf("%04d",s[*s]);
    system("pause");
    return 0;
}
2009-08-06 14:19
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
回复 8楼 godbless
那个是谁写的?

我怎么同时看到了好几个版本的。包括你那个版本求bigInteger阶乘的。

[ 本帖最后由 wxjeacen 于 2009-8-6 14:39 编辑 ]

test_c++.tar.gz (105.78 KB)

生命不熄,战斗不止.
2009-08-06 14:37
godbless
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:216
专家分:950
注 册:2009-7-24
收藏
得分:0 
以下是引用wxjeacen在2009-8-6 14:37的发言:回复 8楼 godbless那个是谁写的?我怎么同时看到了好几个版本的。包括你那个版本求bigInteger阶乘的。
int main()//雨中飞燕之作
2009-08-06 14:42
快速回复:求助,C语言编写求值1!+3!+5!....+n!
数据加载中...
 
   



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

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