«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

本站技术贴除标明为“原创”的之外,其余均为网上转载,文中我会尽量保留原作者姓名,若有侵权请与我联系,我将第一时间做出修改。谢谢!

             ——既瑜


天气预报(南京)


我的分类(专题)

首页(183)
【趣味文摘】(22)
【五子连珠】(13)
【技术文档】(136)
【电脑技术】(6)
【疑难问题】(1)
【我的心情】(5)


最新日志
花语(中英文对照版)
各种花的花语
NTFS格式的7个精彩问答(pconli
童言无忌,有趣得一蹋
给MM修电脑的三个步骤[转载]
J2EE 面试题综合
JAVA编程规则
[转] P2P之UDP穿透NAT的原理与
[转]词法分析器
文件加密技术
一个让人发狂的PI求解C程序
[转]直线生成算法之DDA
[转]利用内核对象----互斥量实现应用
[转]如何正确的计算文件收发进度
双机调试VC程序
[转]分治法优化大整数乘法 C++实现
浮点数值的内存结构
[转]双链表实现大整数的加法与乘法[VC
拜占廷将军问题[转]
某人的挂QQ的程序源代码,虽然没用了,拿

最新回复
回复:vc中的CString的操作
回复:[转]分治法优化大整数乘法 C++
回复:[转]分治法优化大整数乘法 C++
回复:花语(中英文对照版)
回复:基本排序算法比较与选择[转载]
回复:c++中强制类型转换操作符小结
回复:c++中强制类型转换操作符小结
何必那么执着于是大头猫还是愤怒的小鸟,淡
回复:浮点数值的内存结构
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:32位位图到24位位图的转换
dren, ages 16 and 20
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:花语(中英文对照版)
回复:各种花的花语

留言板
签写新留言

不是0-1背包喔
桂花的花语``
谢谢
提议
提议

统计
blog名称:★既瑜★
日志总数:183
评论数量:636
留言数量:-25
访问次数:1406009
建立时间:2005年3月12日

链接


http://www.nju.edu.cn
http://bbs.nju.edu.cn 
http://www.t7-online.com
http://www.csdn.net
http://www.91f.net
http://www.crsky.com
我的MSN BLOG 

联系我

  OICQ:215768265
  njucs2001@hotmail.com
  erichoo1982@gmail.com

 

W3CHINA Blog首页    管理页面    写新日志    退出


[【技术文档】]1000的阶乘的处理[转载]
既瑜(224499) 发表于 2005/3/20 0:03:16

代码:500)this.width=500'>BigDate.rar 上次一位兄弟向我提出了1000的阶乘如何求得。其实这里的难点就在于结果如何保存,以及一个数值如何 与很大的数值相乘。   实现原理: 处理的方法可能有很多种,我下面便是一种平时用笔做乘法的做法。大家先看看这个图: 500)this.width=500'> 在程序中我定义一个足够大的unsigned int数组,然后数组中的每一个单元存放0-999,999之间的数(可 大可小,但不能太大,后面会解释),实际上我们形成了一个1,000,000进制的算法。每个单元大于999,999 时,向前进位。然后我们一单元一单元地相乘,直到被乘值的每一单元乘到为止。这样一个数乘以大数就完 成了。最低位在数组的起始地址中,然后依次排向最高位。 显示我们的结果时,我们可采用精确显示,也可使用科学计数法显示。精确显示时,将从最高单元到 最低单元一个个显示,每一位转化6个十进制字符(最高位除外),不足补0,这样结果就以十进制显示出来 了。   主要代码:(以下在VC6.0中通过调试。代码从附件截取) 计算阶乘并显示结果{...    unsigned int buf[500];    int lenth=CalculateFactorial(date, buf);     //结果作字符串处理    //最高位    char tmp[10];    ::sprintf(tmp, "%d", *(buf+lenth-1));    this->m_strResult = tmp;    //其余位    for ( int i=lenth-2; i>=0; --i )    {        ::sprintf(tmp, "%.6d", *(buf+i));        this->m_strResult += tmp;    }     //结果作科学计算法处理    this->m_strRecult2 = this->m_strResult.GetAt(0);    this->m_strRecult2 +=’.’;    if ( this->m_strResult.GetLength()==1 )        this->m_strRecult2 += ’0’;    else        this->m_strRecult2 += this->m_strResult.Mid(1, 15);    this->m_strRecult2 += "e+";    ::sprintf(tmp, "%d", this->m_strResult.GetLength()-1);    this->m_strRecult2 += tmp;  ...} 计算阶乘,结果存在Buf中,低位在数组的启始点int CBigDateDlg::CalculateFactorial(int date, unsigned int *Buf){    int carry=0; //进位值    unsigned int *pTop=Buf; //当前值的最高位    unsigned int *p=NULL;    int i;    const int eachValue=1000000; //进制,也就是指缓冲区中每个单达到此值就溢出    *Buf = 1;    //阶乘的每个数    for ( i=2; i<=date; ++i )    {        //每一个数将乘上原有的结果        for ( p=Buf; p<=pTop; ++p )        {            *p = *p*i+carry;            if ( *p>=eachValue )//溢出测向前进位            {                carry = *p/eachValue;                *p %= eachValue;            }            else //否则进位值为0            {                carry=0;            }        }        if ( carry>0 ) //跟结果相乘后,整个数有溢出        {            ++pTop;             *pTop = carry;            carry=0;        }    }    return pTop-Buf+1; //有多少个单元}   注意点: 1、我们可以定义为unsigned char数组,然后形成10进制或100进制。我之所以用1,000,000进制是为了加 快处理速度,这样不存在巨大的进位操作。2、对结果位数的估计,以便缓冲区空间大小的定义。我们知 道一个数乘以一个X位的数,最多增加X位,那么我们可粗略估计1000!=1*10+2*90+3*900=2890位,然后我 们数组中每一单元存放6位,则得出我们需要定义的空间大小=2890/6+1=482;3、我们要注意数值的溢出 ,上面我提到进制不能太大,主要是防止乘法运算时产生溢出。因为unsigned int型最大能表示 2^32=4,292,967,295, 对现在的算法来说,即最大可达1,000,000,000进制,但由于你得保证乘数与被乘数不 溢出,所以得减小,现在我们用的1,000,000进制,则乘数可达3位数(1,000也可包含在内),当我们的乘数再 增大时,那我们就得减小进制。4、此题没有考虑乘数很大,因为在这里最大时都只有1000。如果很大时 ,我们就得将乘数分开来做。跟我们小学学的两位数和多位数乘法差不多。5、在这里实际上是建立在原 始的10进制的基础上,缓冲区真的值只能我们自己解释,所以你简单地显示16制是错误的,要显示16进制则 需我们按照10->16进制的做法,再进行运算后得出。 所附代码实现了0-1000内任一数的阶乘的运算。并将结果以精确值和科学计数法进行显示。粗 步测试跟计算器的运算结果没有出入。运行图如下: 500)this.width=500'> 如果大家有更好、更快的方法请指教! 代码:

阅读全文(3014) | 回复(-3) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.346 second(s), page refreshed 144762831 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号