| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2122 人关注过本帖
标题:分享一个能计算14 以上阶乘方法 给出学者的帮助
取消只看楼主 加入收藏
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
结帖率:80%
收藏
 问题点数:0 回复次数:4 
分享一个能计算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
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
以前问了那么多  现在就拿些容易的帮助初学者  应该的
2007-12-17 11:46
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 8# 的帖子
可以把乘出先看成是不是12345  这个函数的公能是把其数加到相应的数组位置上
2007-12-17 21:05
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
其实前面早有许多前辈写过关于阶乘的程序了,在这里我是多加了些注释,方便大家能看懂,基本上注释全写清楚了
2007-12-17 22:46
r316999443
Rank: 7Rank: 7Rank: 7
来 自:星城长沙
等 级:黑侠
威 望:1
帖 子:597
专家分:501
注 册:2006-11-7
收藏
得分:0 
回复 13# 的帖子
谢谢13# 的提醒  这是修改后的
#include<stdio.h>
#define Length 2000
int a[Length];
int ExitsNum();
void LoadArray()//初始话数组
{
   int i1;
   for(i1=1;i1<=Length;i1++)//循环当前数组所有长度
   {
      a[i1]=0;//组全部初始化为0
   }
}
void CatchNum(int p)//数组进位
{
    int temp;//用于临时存储个位以上的数值
    temp=a[p]/10;//将所得的2位以上的数值保存在temp中
    a[p]=a[p]%10;
    while(temp!=0)//判断temp里是否存有两位数以上的数,如果有放入p+1位上去
    {   
         p++;//将数组下标后移一位
         a[p]=a[p]+temp%10;//再取改变后的temp的个位的值
         temp=temp/10;//temp里是否存有两位数以上的数 有继续while 没有退出
    }
}
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;//先对数组每个元素做乘法            
        for(l=0;l<q;l++)
            CatchNum(l);//再对数组每个元素分别进位
    }
}
int ExitsNum()//判断有效位
{
   int i,temp;
   int k=0;//保存数值为0的数组长度值
   i=Length;//  
   while( a[i] ==0 )//遇到不为0的数组元素 时退出循环
   {      
        k++;
        i--;
   }
   return Length-k+1;//返回长度值
}
void print()//对数组的数据进行 输出  注:此处为逆向输出
{
    int i=0,j;//判断有效位
    i=ExitsNum();//取得有效位
    for(j=i;j>=0;j--)//逆向输出
    {
       printf("%d",a[j]);//输出最后数据
    }
}
void main()
{
    int n;
    while(1)
    {
      a[0]=1;//初始化第一个数 为1 (为什么? 因为零乘任何数都为零)
      LoadArray();//对数组初始化
      printf("请输入你要计算的阶乘数:");
      scanf("%d",&n);   
      multi(n);//计算
      printf("得到的数据为:");
      print();//打印出数据
      printf("\n");
      printf("数据长度为:%d",ExitsNum());
      printf("\n");
    }
}
2007-12-19 00:11
快速回复:分享一个能计算14 以上阶乘方法 给出学者的帮助
数据加载中...
 
   



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

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