| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3517 人关注过本帖, 1 人收藏
标题:发一个计算任意阶乘的程序,请多提意见
只看楼主 加入收藏
lhsong
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-12-22
收藏(1)
 问题点数:0 回复次数:14 
发一个计算任意阶乘的程序,请多提意见
输入的数值超过10000时,运算时间较长,若达到10万,需20--30分钟

计算阶乘.rar (106.98 KB)

/****************************************************************/
/*
* 程序目的:求任意位数的阶乘。
* Author  :lhsong
* Date           :2008-4-22
*/

#include <stdio.h>
#include <iostream>
using namespace std;
#define kk 1000   
#define BS 5     //分配内存放大倍数

int main()
{
      
        int *data=new int[kk+1];              /* data[0] 未使用*/
        int index = 1;                        /* 表示数组中的位数 */
        int n=1;                              /* 准备计算的数值 */
        int a;       //进位值
        int ff=kk+1;
        while(n!=0){
          cout << " 输入需计算的阶乘(0退出): " ;
          cin >> n;
          cout<< endl;
        if(n>10000)
                cout<<" 输入的数值太大,运算时间较长,请耐心等待!"<<endl<<" 正在计算..."<<endl;
            else
                  cout<<" 请稍后!正在计算..."<<endl;
                
                
        /* 初始化数组 */
        for(int i =0; i<ff; ++i)
                data[i] = 0;
        a=0;                              /* 初始,a=0 */
        index = 1;
        data[1] = 1;                        /* 初始,1!=1 */
        for(int i=1; i<=n; ++i)
           {
                /* 计算阶乘 1x2x3x4x5x6x7x8x9x...(n-1)xn*/
                a=0;
                for(int j=1; j<=index; ++j){
                          data[j]=a+data[j]*i;     //计算乘积的每一位与下一个乘数的乘积,并加上上一个的进位
                          a=data[j]/10;              //a存储商
                            data[j]%=10;       //该数组位存储乘积的个位数
                         if(j==index&&a!=0){  //如果已达到有效位数,如123456中,j=6,index=6,a=306,则需将a值计入下一个数组位,且index增1,并将新增位数的值拆分为0~9一次计入后面的数组,
                                data[j+1]+=a;    /* 当前位进位 */
                                for(int m=j+1;a!=0;){
                                     index++; //记录有效数组位数
                                     if(index==ff-1){  //如果数组已满,则增加数组的位数(原默认位数为ff-1=kk=1000位,即最大为449的阶乘,450的阶乘有1001位),并重新计算
                                          if(n<=1000)ff=2569+1;   //1000的阶乘为2568位
                                             else if(n<=5000)ff=16328+1;
                                                else if(n<=10000)ff=35662+1;
                                                      else  if(n<=15000)ff=56132+1;
                                                            else  if(n<=20000)ff=77338+1;
                                                                   else  if(n<=30000)ff=121290+1;
                                                                       else  if(n<=50000)ff=213284+1;
                                                                           else  if(n<=100000)ff=456575+1;
                                                                               else  ff=n*BS+1;  //需分配的内存数
                                                            delete []data;
                                                 a=0;                              /* 初始,a=0 */
                                                 index = 1;             /* 初始,1!=1 */
                                                 data=new int[ff];
                                                 /* 初始化数组 */
                                                 for(i =0; i<ff; ++i)
                                                      data[i] = 0;
                                                 data[1] = 1;   
                                                 i=1;     //将循环记录初始化
                                                 goto hh;              //重新计算
                                             }
                                  a=data[m]/10;
                                        data[m]%=10;//该数组位存储个位数
                                        data[m+1]+=a;/* 当前位进位 */
                                        m++;
                                       // cout<<"j="<<j<<",index="<<index<<",a="<<a<<" ";
                                        if(a==0)goto hh;//计算下一轮乘数
                                }//循环,直到数组中每一位存储0~9的数字,
                        }                     
                    }
                    hh:;//计算下一轮乘数
                }
                if(n!=0){
                cout << n << "! = ";
                for(int j=index; j>0; --j)
                        cout << data[j];
                cout << endl;
                cout<<"\a 共有:"<<index<<"位。"<<"最大位数:"<<ff-1<<"位。"<<endl;
                  }
            end:;
    }
        delete []data;
        return 0;
}

[[it] 本帖最后由 lhsong 于 2008-4-27 11:24 编辑 [/it]]
搜索更多相关主题的帖子: 阶乘 int 意见 define 
2008-04-27 11:20
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
#include<stdio.h>
unsigned x[8000]={0},n,p,i,j,t;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
      x[p=7998]=1;
      for(i=1;i<=n;i++)
      { x[--p]=x[--p]=0;
        for(j=7998;j>p;j--) {x[j]*=i; t=j+1; x[j]+=x[t]/100000; x[t]%=100000; }
        while(!x[p]) p++;
      } for(printf("%u",x[p++]);p<7999;p++) printf("%05u",x[p]); printf("\n");
    }
    return 0;
}

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-04-27 14:49
lhsong
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-12-22
收藏
得分:0 
算法倒是简洁,但最多只能计算到2672的阶乘,无法达到50000抑或100000的阶乘,不过值得借鉴算法
2008-04-27 18:04
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
[bo]以下是引用 [un]lhsong[/un] 在 2008-4-27 18:04 的发言:[/bo]

算法倒是简洁,但最多只能计算到2672的阶乘,无法达到50000抑或100000的阶乘,不过值得借鉴算法

你试试把7998,7999都增大M,例如到1000000,1000001,就可以了.~不值得借鉴就算了,不过这个代码速度肯定高与您的代码,速度快3-5倍左右

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-04-27 18:14
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
再者.我的那个代码不修改可以计算到10000,而不是2672~

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-04-27 18:17
思考ING
Rank: 1
来 自:重庆
等 级:新手上路
帖 子:140
专家分:0
注 册:2008-3-12
收藏
得分:0 
顶一个!强悍!

天生孤独的思考~~~~~~~~~
2008-04-27 23:12
summer198191
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-7-13
收藏
得分:0 
回复 2# 卧龙孔明 的帖子
斑竹大大能否讲解一下你的算法思想呢,研究了下,不是很明白呢~!
谢谢啦!
2008-07-13 02:46
hangeng
Rank: 2
等 级:论坛游民
帖 子:424
专家分:39
注 册:2007-7-23
收藏
得分:0 
程序代码:
/*
版本:1.0
作者:韩耿 
完成时间:

程序描述:  1阶乘
   
   
编译器:VC++6.0 精简版

*/


#include <stdio.h>
#include <math.h> //  反正不知道程序中用不用 加上也无妨
#include <conio.h>
#include <iostream.h>



void  main(void)
{    
    int factorial(unsigned long int);
     
     unsigned long int  n=0;
     unsigned long int  zhi;  
     
       //阶乘数 
     printf("请输入阶乘数!\n");
     printf("n=");
     
     scanf("%ld",&n);
     
     printf("您输入的阶乘数为 %ld",n);
     
     zhi=factorial(n);
     
     printf("结果为%ld",zhi );
     
     getch();
      
} 


int  factorial(unsigned long int jiecheng )
{
   static  unsigned long  int a,b,c,jieguo;
   
        a=jiecheng;
        b=jiecheng;

        jieguo=1;
        c=1;
   // 在此确认进入循环的数的初始值

        printf("\n初始值\n");

        printf("jiecheng=%ld\na=%ld\nb=%ld\nc=%ld\n",jiecheng,a,b,c);

 //以下为阶乘的运算
         for (a=jiecheng;a>0;a--)
         {   
          printf  ("\brun here\n");
          jieguo=jieguo*a;
          printf("\n\n jieguo=%ld\n",jieguo);
          printf("\na=%ld\n",a);
        }


   printf("阶乘结果为%d",jieguo);
   getch();
   
   return    (jieguo);
   
    

}



我也发个阶乘的程序!
这是我从我一个小程序中拆出的!

当时孔明给我了上面那个程序,但我无法调用,所以我也写了一个

  雨水冲不进窗来,在玻璃上痛哭。但它至少奋斗过。
2008-07-13 10:02
界水乘风
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-07-13 10:15
伤心的我
Rank: 1
等 级:新手上路
帖 子:82
专家分:0
注 册:2008-5-24
收藏
得分:0 
涓嶆噦
2008-07-13 10:23
快速回复:发一个计算任意阶乘的程序,请多提意见
数据加载中...
 
   



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

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