已锁定- -| 回首页 | 2005年索引 | - -计算e的16位汇编程序代码[zt]

n!

关键词n!                                          

主  题:
求 n!。
作  者:robbin214 (路漫漫)
信 誉 值:100
所属论坛:C/C++ C语言
问题点数:10
回复次数:12
发表时间:2005-11-18 20:45:05
今天去研华面试,有到题目,求 n!,当时兴奋,匆匆作答。回来思考不对阿,没有考虑越界啊我,晕!
  还望各位指点!
  谢谢
回复人: Kvci(野蛮) ( ) 信誉:100 2005-11-18 20:51:00 得分:0
 
考虑越界
那就麻烦拉
Top
回复人: Cantonese00(++C (Thinking in the restless night)) ( ) 信誉:100 2005-11-18 20:59:00 得分:0
 
以前有过
帮你帖出以前辈做的:

#include "iostream.h"
#include "math.h"
#include "stdlib.h"
/*
  计算n!有多少位
  也就是求n! < 10^sum  最小的sum就是位数
  两边取对数 log10 1 + log10 2 + .... + log10 n < sum
*/
int GetLength(int n)
{
	double sum = 1.0;
	for (int i = 1; i <= n; i++)
	{
		sum += log10((double)i);
	}
	return (int)sum;
}

/*
  计算n!的值
  result是要把申请到空间的数组传进来
*/
void Calculate(char* result, int n)
{
   int carry = 0; //进位
   int begin = 0; //计算的结果末尾有几个0
   double bitCount = 1.0; //算到多少位了
   int temp;
   for (int j = 2; j <= n; j++)
   {
       bitCount += log10((double)j);

	   if (result[begin] == 0) //result数组后面有几个0
	   {
		   begin++;
	   }
	   
	   for (int k = begin; k <= (int) bitCount; k++) 
	   {	   
		   temp = (j * result[k] + carry) / 10; //进位是多少
	       result[k] = (char)((j * result[k] + carry) % 10); //余数 
		   carry = temp;  //
	   }
   }
}
void main()
{
   int n;
   int length; //n!的长度
   cout << "请输入一个正整数的来求它的阶乘: ";
   cin >> n;
   
   length = GetLength(n);
   char* arr = new char[length]; //动态分配数组
   if (!arr)
   {
	   cout << "分配内存出错";
	   exit(1);
   }

   //初始化数组
   arr[0] = 1;
   for (int i = 1; i < length; i++)
   {
	   arr[i] = 0;
   }
   
   //计算结果
   Calculate(arr, n);
   
   int bit = 1;
   for (i = length - 1; i >= 0; i--)
   {
	   cout <<(int) arr[i] << " ";
	   
	   if (bit % 10 == 0) //每10个输出一行 
	   {
		   cout << endl;
	   }
	    bit++;
   }
   cout<< endl;
}


主要的思想是用字符数组模拟了乘法的运算过程
(程序不是本人写的,是以前收集的)
Top
回复人: csucdl(csucdl) ( ) 信誉:100 2005-11-18 21:18:00 得分:0
 
一般的阶乘算法 由于采用一个整数来存储结果,所以对于输入n 一般要小于13,否则结果正溢出
所以应该使用数组来存储较大输入的阶乘结果,也是大数分解的一种方法,数组的每个元素来存储大数的M位,M有上下文来确定
Top
回复人: Mr_Yang(初级程序员) ( ) 信誉:95 2005-11-18 21:20:00 得分:0
 
受益匪浅!
Top
回复人: qdhuxp(阿牛) ( ) 信誉:100 2005-11-19 15:12:00 得分:0
 
学习!
Top
回复人: zhyl0219(漂泊的人) ( ) 信誉:97 2005-11-19 17:57:00 得分:0
 
study!
Top
回复人: MooseWOler(Mr.Oler) ( ) 信誉:100 2005-11-19 18:04:00 得分:0
 
看看这个吧,讨论的满激烈的
http://community.csdn.net/Expert/topic/4366/4366895.xml?temp=.4983484
我曾经做了一个,可以计算到500的,后来看了大家的思路才觉得仍有很大的发挥余地
Top
回复人: MooseWOler(Mr.Oler) ( ) 信誉:100 2005-11-19 18:07:00 得分:0
 
40000!一共166714位, 用时0.194686s
50000!一共213237位, 用时0.272313s

用HugeCalc( http://maths.diy.myrice.com/software.htm )计算得出

Top
回复人: quchaolove(安然·龙族) ( ) 信誉:100 2005-11-19 19:04:00 得分:0
 
学习
Top
回复人: jxufewbt(我的目标是5星) ( ) 信誉:100 2005-11-19 19:07:00 得分:0
 
学习
Top
回复人: spiderman2004() ( ) 信誉:100 2005-11-19 20:22:00 得分:0
 
学习
Top
回复人: FriendLG(小刚) ( ) 信誉:100 2005-11-19 21:34:00 得分:0
 
终于看懂了,忽
有一个问题:
Calculate函数中:
for (int k = begin; k <= (int) bitCount; k++) 
循环次数应该是:k<= (int) bitCount-1;或者是 k <(int) bitCount
在单步运行中发现的,虽然多循环一次也可以得到正确结果,但是修改了下一个字节的内容
http://community.csdn.net/Expert/topic/4403/4403630.xml?temp=.7404596

【作者: akerlee】【访问统计:】【2005年11月20日 星期日 01:42】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3583015

博客手拉手

[2005-11-16 15:15:11.0]    Guns n’Roses[枪与玫瑰/枪花]全集78首

[2005-11-18 06:52:11.0]    Guns n’Roses[枪与玫瑰/枪花]全集78首

[2005-11-18 22:35:25.0]    2004湖北高考作文——笑翻N多人

[2005-11-19 10:56:22.0]    再见理想

[2005-11-16 21:24:31.0]    今天仿佛失恋了之N哥哥的心情日记嘿嘿~~

回复

评论内容: