| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 1115 人关注过本帖
标题:分享一个能计算14 以上阶乘方法 给出学者的帮助
收藏  订阅  推荐  打印 
r316999443
Rank: 3Rank: 3
来自:星城长沙
等级:中级会员
帖子:452
积分:4968
注册:2006-11-7
分享一个能计算14 以上阶乘方法 给出学者的帮助

#include<stdio.h>
#define Length 2000
int a[Length];
int ExitsNum()//判断有效位
{
   int i,temp;
   int k=0;//保存数值为0的数组长度值
    for(i=Length;i>=0;i--)
   {
      if(a[i]==0)//遇到不为0的数组元素 时退出循环
        k++;
      else
       break;
   }
   temp=Length-k;//取得实际长度值
    return temp;
}
void LoadArray()//初始话数组
{
   int i;
   for(i=1;i<=Length;i++)//循环当前数组所有长度
   {
      a[Length]=0;//组全部初始化为0
   }
}
void CatchNum(int p)//数组进位
{
    int temp;//用于临时存储个位以上的数值
     temp=a[p]/10;//将所得的2位以上的数值保存在temp中
     p++;//向前进位
     if(temp!=0)
    {
       a[p]=a[p]+a[p]%10;//进位数相加
        CatchNum(p);//为2位以上 继续进位
     }
    else
       a[p]=a[p]+temp;//将最后的结果放在p上 注意:p++
}
void multi(int k)//对传入的k做乘法
{   
    int i;
    int q=0;//用于判断有效位
     int l=0;//用于有效位数 (分别对数组每个元素做乘法)
    for(i=1;i<=k;i++)
    {
        q=ExitsNum();//取得数组长度
         for(l=0;l<=q;l++)//对数组每个元素做乘法
         {
          a[l]=a[l]*i;
          if(a[l]>9)//判断第L次乘法是否需要进位(大于9进位)
          {
             CatchNum(l);//调用进位函数
            }
        }
    }
}
void print()//对数组的数据进行 输出  注:此处为逆向输出
{
    int i=0,j;//判断有效位
    i=ExitsNum();//取得有效位
    for(j=i;j>=0;j--)//逆向输出
    {
        printf("%d",a[j]);//输出最后数据
    }
}
void main()
{
    int n;
    a[0]=1;//初始化第一个数 为1 (为什么? 因为零乘任何数都为零)
    scanf("%d",&n);
    LoadArray();//对数组初始化
     multi(n);//计算
     print();//打印出数据
}
搜索更多相关主题的帖子: 阶乘  学者  分享  
2007-12-17 11:33
bysdy
Rank: 1
等级:新手上路
帖子:30
积分:422
注册:2007-7-29

注释好详细啊
谢谢楼主啦~~~~
2007-12-17 11:43
r316999443
Rank: 3Rank: 3
来自:星城长沙
等级:中级会员
帖子:452
积分:4968
注册:2006-11-7

以前问了那么多  现在就拿些容易的帮助初学者  应该的

如果世界上只需要"用户名",而不需要"密码",那么世界将会完美吗?
2007-12-17 11:46
xianshizhe111
Rank: 6Rank: 6
等级:金牌会员
帖子:1451
积分:15818
注册:2007-12-8

谢谢楼主了,辛苦了.
2007-12-17 15:42
余辉
Rank: 1
等级:新手上路
帖子:6
积分:166
注册:2007-12-17

不知道对不对,初始话数组里的a[length]应该是a[i]吧
2007-12-17 16:54
gaoyuanyao
Rank: 1
等级:新手上路
帖子:9
积分:206
注册:2007-12-15

好复杂,不过阶乘不是用递归比较好吗??
int main()
{
  int i;
  int b=0;
    printf("请输入一个整数:\n");
    scanf("%d",&i);
if(i<=0)
   printf("只能输入正数");
  b=fun(i);
  printf("%d的阶乘是:%d",i,b);
  system("PAUSE");
  return 0;
}
int fun(int a)
{
  if(a==1)return 1;
  int s;
  s=a*fun(a-1);
  return s;
}
如果考虑到各种问题,数据类型应该用long,而且在某些地方添加判断会比较好的

[[italic] 本帖最后由 gaoyuanyao 于 2007-12-17 19:26 编辑 [/italic]]
2007-12-17 19:25
xianshizhe111
Rank: 6Rank: 6
等级:金牌会员
帖子:1451
积分:15818
注册:2007-12-8

这是大阶乘,用别的方法很难办到.
2007-12-17 19:41
dousao
Rank: 3Rank: 3
等级:中级会员
帖子:196
积分:2122
注册:2007-11-8

...
对于进位那里的函数不太明白,楼主可以解释下吗?
void CatchNum(int p)//数组进位
{
    int temp;//用于临时存储个位以上的数值
     temp=a[p]/10;//将所得的2位以上的数值保存在temp中
     p++;//向前进位
     if(temp!=0)
    {
       a[p]=a[p]+a[p]%10;//进位数相加
        CatchNum(p);//为2位以上 继续进位
     }
    else
       a[p]=a[p]+temp;//将最后的结果放在p上 注意:p++
}
是什么意思呢?他要达到什么样的目的?
2007-12-17 20:14
beyondjoe
Rank: 1
等级:新手上路
帖子:20
积分:312
注册:2007-7-5

应该是a[i]才对~~~
2007-12-17 20:45
r316999443
Rank: 3Rank: 3
来自:星城长沙
等级:中级会员
帖子:452
积分:4968
注册:2006-11-7
回复 8# 的帖子

可以把乘出先看成是不是12345  这个函数的公能是把其数加到相应的数组位置上

如果世界上只需要"用户名",而不需要"密码",那么世界将会完美吗?
2007-12-17 21:05
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.058886 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved