帮我优化一下超精度阶乘的代码.

wfront 2005-04-14 03:40:00
帮我优化一下超精度阶乘的代码.我写的很不好,特别是要申请的内存单元太大了.
如果代码太垃圾,可以全部推翻重写的,IDE是DEV C++
============================================
#include<stdio.h>
#include<stdlib.h>

using namespace std;
const int num=40000;

/*
将整数转换成数组
*/
int* inttoarray(int x)
{
int *a,i=0;
a=(int *)calloc(5,sizeof(int));
do
{
*(a+i)=x%10;
x/=10;
i++;
}
while(x>0);
return a;
}

/*
模拟乘法
*/
int* factorial(int *a,int *b)
{
int *c,i,j;
c=(int *)calloc(num,sizeof(int));
if(c==NULL)
{
printf("Error");
return NULL;
}
for(i=0;i<num;i++)
{
if(*(a+i)==0)continue;
for(j=0;j<5;j++)
{
if(*(b+j)==0)continue;
*(c+i+j)+=(*(a+i))*(*(b+j));
if(*(c+i+j)>9)
{
*(c+i+j+1)+=*(c+i+j)/10;
*(c+i+j)%=10;
}
}

}
free(a);
free(b);
return c;
}

/*
倒序输出
*/
void outputarray(int *a)
{
int i;
for(i=num-1;i>=0;i--)
{
if(*(a+i)!=0)break;
}
printf("阶乘结果为:");
for(;i>=0;i--)
{
printf("%d",*(a+i));
}
printf("\n");
}

int main(int argc, char *argv[])
{
int n,i,*a;
a=(int*)calloc(num,sizeof(int));
*a=1;
printf("你想求什么数的阶乘?请输入该数:");
scanf("%d",&n);
printf("开始...\n");
for(i=1;i<=n;i++)
{
a=factorial(a,inttoarray(i));
if((i%(n/80))==0)printf(">");
}
printf("完成\n");
outputarray(a);
system("PAUSE");
return 0;
}
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfront 2005-04-14
  • 打赏
  • 举报
回复
pcboyxhy(-273.15℃) 还有就是你这个程序计算 5! 会崩溃
---------------------------------------------
把那个该死的进度条 "if((i%(n/80))==0)printf(">"); "去掉就没问题了


谢了大家了,我只放50分是太小器了,下次有问题一定多放分.
ycom__net 2005-04-14
  • 打赏
  • 举报
回复
那我也贴一个!#include<stdio.h>

int main(int argc, char *argv[])
{

long i, j, c, len, temp = 0;
int n = 1;
printf("input n [from 1 to 10000] please! \n");
while(scanf("%ld", &n) && n != 0)
{
long *a = new long[4 * n]; //动态分配空间
a[0] = 1, len = 1;
for(i = 1; i <= n; i++)
{
c = 0;
for(j = 0; j < len; j++)
{
temp = a[j] * i + c;
c = temp / 100000;
a[j] = temp % 100000;
}

while(c > 0) //处理进位
{
len = len + 1;
a[len - 1] = c;
c /= 100000;
a[len - 1] %= 100000;
}
}
printf("%ld", a[len - 1]);
for(i = len - 2; i >= 0; i--) //逆序输出

printf("%05ld", a[i]);

printf("\nif you want to quit ,please input 0! \n");
delete a; //释放空间
}
return 0;
}
pcboyxhy 2005-04-14
  • 打赏
  • 举报
回复
申请内存之前可以先计算需要申请多少

s= log10(1)+log10(2)+log10(3)+......+log10(n)+1
因为采用100000进制
所以
s'= s/5+1
pcboyxhy 2005-04-14
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>

const int num=40000;
const long base=100000;

/*
将整数转换成数组
*/
int* inttoarray(int x)
{
int *a,i=0;
a=(int *)calloc(5,sizeof(int));
do
{
*(a+i)=x%base;
x/=base;
i++;
}
while(x>0);
return a;
}

/*
模拟乘法
*/
int* factorial(int *a,int *b)
{
int *c,i,j;
c=(int *)calloc(num,sizeof(int));
if(c==NULL)
{
printf("Error");
return NULL;
}
for(i=0;i<num;i++)
{
if(*(a+i)==0)continue;
for(j=0;j<5;j++)
{
if(*(b+j)==0)continue;
*(c+i+j)+=(*(a+i))*(*(b+j));
if(*(c+i+j)>=base)
{
*(c+i+j+1)+=*(c+i+j)/base;
*(c+i+j)%=base;
}
}

}
free(a);
free(b);
return c;
}

/*
倒序输出
*/
void outputarray(int *a)
{
int i;
for(i=num-1;i>=0;i--)
{
if(*(a+i)!=0)break;
}
printf("阶乘结果为:");
for(;i>=0;i--)
{
printf("%05d",*(a+i));
}
printf("\n");
}

int main(int argc, char *argv[])
{
int n,i,*a;
a=(int*)calloc(num,sizeof(int));
*a=1;
printf("你想求什么数的阶乘?请输入该数:");
scanf("%d",&n);
printf("开始...\n");
for(i=1;i<=n;i++)
{
a=factorial(a,inttoarray(i));
if((i%(n/80))==0)printf(">");
}
printf("完成\n");
outputarray(a);
system("PAUSE");
return 0;
}


还有就是你这个程序计算 5! 会崩溃
du51 2005-04-14
  • 打赏
  • 举报
回复
#include<iostream>
#include<stack>
#include<fstream>
using namespace std;
struct Node
{
int i;
Node *next;
};
Node *createNode()
{
Node *node=new Node;
node->i=0;
node->next=NULL;
return node;
}
Node* MulLink(Node *head,int i)
{
Node *p=head;
head->i=1;
p=head;
int temp=0;
for(int j=1;j<=i;j++)
{
while(p)
{
p->i*=j;
p->i+=temp;
if(p->i>9)
{
temp=p->i/10;
if(!p->next)
p->next=createNode();
p->i%=10;
p=p->next;
}
else
{
temp=0;
p=p->next;
}
}
p=head;
}
return head;
}
void displayLink(Node *head)
{
fstream outfile;
stack<int> display;
outfile.open("example.txt",ios::out|ios::ate);
while(head)
{
display.push(head->i);
head=head->next;
}
while(!display.empty())
{
cout<<display.top();
outfile<<display.top();
display.pop();
}
cout<<endl;
}
void freeLink(Node *head)
{
Node *p=head;
while(p)
{
head=p->next;
delete p;
p=head;
}
}
int main(int argc,char *argv[])
{
int n;
cout<<"Please input the number"<<endl;
cin>>n;
Node *head=createNode();
MulLink(head,n);
displayLink(head);
freeLink(head);
system("PAUSE");
return 0;
}
lyjlee 2005-04-14
  • 打赏
  • 举报
回复
很简单,不要使用int作为保存数的单位,一个char甚至4-bit足够了
du51 2005-04-14
  • 打赏
  • 举报
回复
你既然用链表了.为什么不考虑用链表动态生成呢......每个结点内存一位就是了.

70,035

社区成员

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

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