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


/****************************************************************/
/*
* 程序目的:求任意位数的阶乘。
* 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;
}
搜索更多相关主题的帖子: 阶乘 int 意见 define 
2008-04-27 11:18
快速回复:发一个计算任意阶乘的程序,请多提意见
数据加载中...
 
   



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

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