计算k的阶乘k!,程序出错!

lzh7800 2003-08-18 09:48:27
由于要求的整数远远大于一般的整数,程序用一维数组存储长整数。
下列程序错在哪?请各位大侠指教。

#include <stdio.h>

#define MAXN 1000

void pnext(int a[],int k)
{
int *b,m=a[0],i,j,r,carry;
b=new int[m+1];
for(i=1;i<=m;++i) b[i]=a[i];
for(j=1;j<k;++j){
for(carry=0, i=1;i<=m; ++i){
r=(i<a[0]? a[i]+b[i]:a[i])+carry;
a[i]=r%10; carry=r/10;
}
if(carry) a[++m]=carry;
}
delete []b;
a[0]=m;
}

void write(int *a,int k)
{
int i;
printf("%4d!=",k);
for(i=a[0];i>0;i--) printf("%d",a[i]);
printf("\n\n");
}

void main()
{
int a[MAXN],n,k;
printf("enter the number of:"); scanf("%d",&n);
a[0]=1;a[1]=1; write(a,1);
for(k=2;k<=n;k++){
pnext(a,k);
write(a,k);
}
}
...全文
125 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
World7th 2003-08-20
  • 打赏
  • 举报
回复
帮你找了一下错误,在void pnext的定义中,把r=(i<a[0]? a[i]+b[i]:a[i])+carry;改为
r = (r<=a[0] ? a[i]+b[i] : a[i]) + carry;应该是i小于等于a[0],以后要细心点
woaichenyu 2003-08-20
  • 打赏
  • 举报
回复
楼上的弟兄,
等我一下
我一会儿来帮你们调试一下
Kaye 2003-08-20
  • 打赏
  • 举报
回复
问问题,先搜索!
http://expert.csdn.net/Expert/topic/2027/2027868.xml?temp=.5239374
iampolaris 2003-08-20
  • 打赏
  • 举报
回复
include <stdio.h>
#include <conio.h>

void main()
{
int a[100], i;
int carrier = 0;
int result;
int num;
int temp;
printf("?");
scanf("%d", &num);
temp = num;
for(i = 0; i < 100; i++) a[i] = -1;
i = 0;
//init the origin array
do{
a[i++] = temp%10;
temp /= 10;
}while(temp != 0);

while(--num > 0) {
i = 0;
while(a[i] != -1) {
result = num * a[i] + carrier;
carrier = result / 10;
a[i++] = result % 10;
}
//if carry occur, operate carray
while(carrier != 0) {
a[i++] = carrier % 10;
carrier /= 10;
}
}
clrscr();
for(i = 99; a[i] == -1; i--);
for(; i >= 0; printf("%d", a[i--]));
}
cxjddd 2003-08-19
  • 打赏
  • 举报
回复
这个问题也就是高精度运算。
bahanzo1 2003-08-19
  • 打赏
  • 举报
回复
这个问题好象有人问过的,
先应该是用对数取得 存放结果的数组的长度,然后再做计算,
数组的每一个元素都只是一位的数码(0~~~9),以这个来存储.
wwj886 2003-08-19
  • 打赏
  • 举报
回复
#include <iostream>
#include <cmath>
using namespace std;

int getN();
int getbit(int n);
char* init(int size);
void calc(char* a,int n);

void main()
{
int n=getN();
int size=getbit(n);
char* pa=init(size);
calc(pa,n);
delete []pa;
}

int getN()
{
int n;
cout << "请输入一个正整数:";
cin >> n;
while(n<0)
{
cout << "输入有错,请重输:";
cin >> n;
}
if(n==0)
exit(1);
return n;
}

int getbit(int n)
{
double sum=1.0;
for(int i=1;i<=n;i++)
{
sum+=log10(i);
}
return num;
}
char* init (int size)
{
char* pa=new char[size];
if(!pa)
{
exit(1);
}
pa[0]=1;
for (int i=1;i<size;i++)
{
pa[i]=0;
}
return pa;
}

void calc(char* a,int n)
{
double bitcount=1.0;
int begin=0;
for(int i=2;i<=n;i++)
{
long and=0;
bitcount+=log10(i);
if(a[begin]==0)
begin++;
for(int j=begin;j<int(bitcount);j++)
{
and+=i*a[j];
a[j]=char(and%10);
and/=10;
}
}
}
hbzx 2003-08-19
  • 打赏
  • 举报
回复
什么叫远大于一般整数?
realmyth 2003-08-19
  • 打赏
  • 举报
回复
我写了一个程序,可供参考一下,希望有帮助.
#include <iostream.h>
const int LENGTH=1000;//预先定义1000位,位数可根据情况调整
int a[LENGTH];
int main()
{
int n,m,i,j,c,t;
cout<<"input the n of "n!":"<<endl;
cin>>n;
a[0]=1;
m=1;
for(i=2;i<=n;i++)
{
for(c=0,j=0;j<m;j++){
t=a[j]*i+c; a[j]=t%10; c=t/10;
}
while (c)
{
a[m++]=c%10;
c=c/10;
}
cout<<n<<"!="<<endl;
for(j=m-1;j>=0;j--) cout<<a[j];
cout<<endl;
}
}
chengsion 2003-08-19
  • 打赏
  • 举报
回复
为了节约空间
建议每个数组元素存放的最大数为9999
即逢10000进1
pengzhenwanli 2003-08-19
  • 打赏
  • 举报
回复
找别人的错误太难了。我没有时间。有好用的干吗不用?
lzh7800 2003-08-19
  • 打赏
  • 举报
回复
谢谢紫气日盈,可是我的错在哪里呢?自己up一下!等等结贴。
pengzhenwanli 2003-08-19
  • 打赏
  • 举报
回复
这个肯定好用。
pengzhenwanli 2003-08-19
  • 打赏
  • 举报
回复
void Factorial( int *array , const int ArraySize,const int n )
{
int i;
int j;
array[0] = 1;
for( i = 1; i<= n; i++ )
{
for( j = 0; j < ArraySize-1; j++)
{
array[j] *= i;
}
for( j = 0 ; j < ArraySize - 1;j++ )
{
array[j+1] += array[j]/10;
array[j] %= 10;
}
}
}
int main()
{
int *p;
int n;
int i;
printf( "%输入想要计算的阶乘\n" );
scanf( "%d",&n );
p=(int*) malloc( sizeof(int)*n);
memset( p,0,sizeof(int)*n);
Factorial( p,n,n);
for( i = n-1;i>=0;i-- )
printf( "%d",p[i] );

}
huoniaolinxi 2003-08-18
  • 打赏
  • 举报
回复
把程序写清楚了再发。
hyclw 2003-08-18
  • 打赏
  • 举报
回复
第8行 b=new int[m+1];
第17行 delete []b
何解?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧