| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3283 人关注过本帖
标题:[求助]计算N的阶乘N!
只看楼主 加入收藏
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
HJin, α和e的精度怎么弄? ... 取个20位?...

btw... 不要用递归.. 效率低了...可以考虑并行乘法...
先实现一个大数类比较好...

女侠,约吗?
2007-08-14 13:44
狂人老大
Rank: 1
来 自:杭州
等 级:新手上路
威 望:1
帖 子:394
专家分:0
注 册:2007-6-21
收藏
得分:0 
递归我用过了 最多只能到计算到16!
#include<iostream>
int fac(int n);
using namespace std;
int main(){
int n;
int w;
cin>>n;
w=fac(n);
cout<<w<<endl;
}
int fac(int n){
int w;
if(n<0)
cout<<"error!"<<endl;
else if(n==0)
w=1;
else
w=n*fac(n-1);
return w;
}

ACMer的QQ群:33741351
单片机QQ群:55130117
2007-08-14 13:47
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
收藏
得分:0 

看问题先,斑竹都说了考虑越界,肯定不是直接写个求 n!。直接的话,用循环不就好了。
一定要用大数类吗?


2007-08-14 14:14
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
收藏
得分:0 
用数组存储计算

Repeat  Life=Study;Until (death);
2007-08-14 14:17
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
收藏
得分:0 
以下是引用缘吇弹在2007-8-14 14:17:33的发言:
用数组存储计算

怎么存?


2007-08-14 16:56
怪怪女巫
Rank: 2
等 级:论坛游民
威 望:4
帖 子:789
专家分:59
注 册:2007-8-10
收藏
得分:0 

int fac(int k)
{
int t=1,i;
for(i=1;i<=k;i++)
t=t*i;
return(t);
}
void main()
{
int n,m;
cout<<"input n: ";
cin>>n;
m=fac(n);
cout<<n<<"!="<<m<<endl;
}
菜鸟级人物,我只学会用这种方法


时间会慢慢沉淀,有些人会在你心底慢慢模糊。学会放手,你的幸福需要自己的成全。
2007-08-14 18:10
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
以下是引用怪怪女巫在2007-8-14 18:10:30的发言:

菜鸟级人物,我只学会用这种方法

可以了, 只不过是容量小些罢了...


女侠,约吗?
2007-08-15 00:48
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
收藏
得分:0 
以下是引用neverDie在2007-8-14 16:56:30的发言:

怎么存?

每个位数作为数组的元素


Repeat  Life=Study;Until (death);
2007-08-15 10:17
neverDie
Rank: 1
等 级:新手上路
威 望:1
帖 子:123
专家分:0
注 册:2007-5-5
收藏
得分:0 
以下是引用缘吇弹在2007-8-15 10:17:35的发言:

每个位数作为数组的元素

这位 BZ 你说了当没说。问题这是在运算,单把个数存数组当然简单,但是也会越界啊!

晕!

我还是找其他办法。

2007-08-15 12:00
缘吇弹
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:43
帖 子:3038
专家分:27
注 册:2007-7-2
收藏
得分:0 
以下是引用neverDie在2007-8-15 12:00:22的发言:
这位 BZ 你说了当没说。问题这是在运算,单把个数存数组当然简单,但是也会越界啊!

晕!

我还是找其他办法。

希望下边对你有帮助。
using namespace std;
#include "StdAfx.h"
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <iomanip.h>

int GetNumber(); //输入 n
int GetBitLength(int n); //求n!的位数
char* Initialize(int); //初始化存储结果的值
void PrintValue(char *a,int size); //打印值到屏幕
void PrintValue(char *a,int size,char* fileName); //打印值到文件
char* GetValue(int val); //计算
char* SubGetValue(char* ,int);


int main()
{
int value=GetNumber();
char fileName[16];
int size=GetBitLength(value);
char *pa = Initialize(size);

//pa=GetValue();
pa=GetValue(value);

PrintValue(pa,size);

//sprintf(fileName,"%s","10000!.txt");
sprintf(fileName,"%d!.txt",value);

PrintValue(pa,size,fileName);
delete []pa; //note:
return 1;
}
//函数GetValue
// 求得计算结果
//返回结果
//History:
//1)char* GetValue()
//2)GetValue(int val)
// 参数:val 计算阶乘的值
char* GetValue(int val)
{
//定义一个数组存储阶乘的值
//首先得到10000!阶乘的位数
int VALUE=val;
int length=GetBitLength(VALUE);
char *arrValue = new char[length];
if(!arrValue) {
cout <<"申请内存失败!" << endl;
exit(1);
}
arrValue[0] = 1;
for(int i=1; i<length; i++)
arrValue[i] = 0;
arrValue=SubGetValue(arrValue,VALUE);
return arrValue;
}

char* SubGetValue(char* arrValue,int n)
{
int index=0;
long carrier=0;
double bitCount = 1;
int begin = 0;

for(index=2; index<=n; ++index)
{
long multiValue = 0;
bitCount += log10((long double)index);
if(arrValue[begin] == 0)
begin++;

for(int j=begin; j<int(bitCount); ++j)
{
multiValue += (index*arrValue[j]);
arrValue[j] = char(multiValue % 10);
multiValue /= 10;
}
}
return arrValue;
}

//得到计算阶乘的值,此函数为新增
int GetNumber()
{
int n;
cout << "请输入要计算阶乘的n值: ";
cin >> n;
while(n < 0) {
cout << "输入错误,请重新输入: ";
cin >> n;
}
if(n == 0)
exit(1);
return n;
}

//函数GetBitLength
// 求得计算结果的位数,本函数为新增加
//参数
// n 需要计算的阶乘的数
//返回结果的位数
int GetBitLength(int n)
{
double sum = 1.0;
for(int i=1; i<=n; i++)
sum += log10((long double)i);
return int(sum);
}

//-----------
//函数:Initialize
// 初始化存储结果的数组
//参数:
// size 数组的长度
//返回值
// 初始化后的数组
//-------------
char * Initialize(int size)
{
char *arrValue = new char[size];
if(!arrValue) {
cout << size<<"太大,申请内存失败!" << endl;
exit(1);
}
arrValue[0] = 1;
for(int i=1; i<size; i++)
arrValue[i] = 0;
return arrValue;
}

//-----------
//函数:PrintValue
// 将结果输入到屏幕上
//参数:
// buff 存储结果的数组
// buffLen 数组的长度
// fileName 文件名
//-------------
void PrintValue(char *buff, int buffLen)
{
int bit = 0;
int nCol=0;
for(int i=buffLen-1; i>=0; i--) {
if(bit % 10 == 0)
{
cout << " " ;
nCol++;
if(nCol==10)cout<<endl;
}
cout << int (buff[i]);
bit++;
}
cout << endl;

}
//-----------
//函数:PrintValue
// 将结果输入到一个文件中
//参数:
// buff 存储结果的数组
// buffLen 数组的长度
// fileName 文件名
//-------------

void PrintValue(char *buff,int buffLen,char *fileName)
{
int bit = 0;
int nCol=0;

FILE *fp=NULL;
//-----------------------------

if (fileName==NULL) return ;
fp=fopen(fileName,"wt");
if (fp==NULL)
{
printf("不能创建文件%s",fileName);
return ;
}

for(int i=buffLen-1; i>=0; i--)
{
fprintf(fp,"%d",int(buff[i]));

if(bit % 9 == 0)
{
fprintf(fp,"%s"," ");
nCol++;
if(nCol==8)
{
fprintf(fp,"%s","\n");
nCol=0;
}
}
bit++;

}
fprintf(fp,"\n");
fclose(fp);
}


Repeat  Life=Study;Until (death);
2007-08-15 13:26
快速回复:[求助]计算N的阶乘N!
数据加载中...
 
   



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

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