| 回复人: 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
在单步运行中发现的,虽然多循环一次也可以得到正确结果,但是修改了下一个字节的内容
|
|