| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 568 人关注过本帖
标题:关于求1000!的代码
只看楼主 加入收藏
ffaannggqq
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2006-12-23
收藏
 问题点数:0 回复次数:9 
关于求1000!的代码
/*这个代码可以求n!的位数<10000的阶层;不过所用时间和空间都较大!在这只考虑了n大于0的情况*/
#include<stdio.h>
void main()
{
int a[10000],length;//创建一个相当于栈的结构
int i,j,n,m;
a[0]=1;a[1]=0;
length=0;
printf("输入n的值:\n");
scanf("%d",&n);
printf("\n");
if(n<0)
printf("error!!");
else
{
for(i=1;i<=n;i++)
{
m=i;
for(j=0;j<=length;j++)//数组从0到length通乘i
{
a[j]=a[j]*m;
}
for(j=0;j<=length;j++)//依次检查数组从0到length
{
if(a[j]>9)
{
if(j==length)//数组最后一个数大于10
{a[j+1]=0;length++;}//初始化a[length+1];即a[j+1];
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
else
a[j]=a[j];
}
}
/*输出数组从length到0*/
while(j>=1)
{
printf("%d",a[j-1]);
j--;
}
printf("\n");
printf("输出位数:\n");
printf("%d\n",length+1);
}
}
搜索更多相关主题的帖子: 代码 
2006-12-31 13:55
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
for(i=1;i<=n;i++)
{
m=i;
for(j=0;j<=length;j++)//数组从0到length通乘i
{
a[j]=a[j]*m;
}
for(j=0;j<=length;j++)//依次检查数组从0到length
{
if(a[j]>=10000)
{
if(j==length)//数组最后一个数大于10000
{a[j+1]=0;length++;}//初始化a[length+1];即a[j+1];
a[j+1]+=a[j]/10000;
a[j]=a[j]%10000;
}
else
a[j]=a[j];
}
}
改成这样再试试

2006-12-31 14:50
ffaannggqq
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2006-12-23
收藏
得分:0 
那样早溢出了

2007-01-01 19:09
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
收藏
得分:0 

把高精度数组的每个元素不要只保存0~9,而是保存成0~9999(因为int型是0到3万多),即万进位制
最后输出高精度数组的时候,要适当在每个数组元素不足四位数时补零,即比如有如下高精度数组
p[0] p[1] p[2]
111 2 444

输入结果应是
11100020444


个人ajax技术专题站: " target="_blank">http://www. 我不会闲你烦,只会闲你不够烦!
2007-01-02 13:17
游乐园
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:671
专家分:0
注 册:2006-11-1
收藏
得分:0 

bc-cn里C区以前有个比赛就是这个题目...这个第一的程序

#include <stdio.h>
/*可以调整MAXW来调整程序能承受的最大位数*/
#define MAXW 10000
int ans[MAXW];
void oprate(int n)
{/*a为每次要乘的数,up保存进位,max保存目前答案最大位数*/
int a,i,up,tmp,max;
ans[0]=1;up=0;max=1;
for(a=2;a<=n;a++)
{
for(i=0;i<max;i++)
{/*高精度乘法*/
tmp=ans[i]*a+up;
ans[i]=tmp%10;
up=tmp/10;
}

while(up)
{
ans[i++]=up%10;
up/=10;
}
max=i;/*新的最高位*/
}
while(max--)
printf(\"%d\",ans[max]);
printf(\"\n\");
}
int main(void)
{
int n;
while(scanf(\"%d\",&n)==1)
{/*输入任意数字字符程序即结束*/
oprate(n);
}
return 0;
}


unicorn-h.spaces. ◇◆ sava-scratch.spaces.
2007-01-02 13:26
tutengwolf
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-12-2
收藏
得分:0 

试一下我的程序把 同时帮忙给改进一下..... 只能算3000 以内的

#include<iostream.h>
#include<string>
void main()
{
int result[10000];
int p=0,i;
int ininum=0;
char ini[10];
int temp;
memset(result,0,sizeof(p)*10000);
cout<<"please input the initial number"<<endl;
cin>>ini;
for( i=0,p=strlen(ini)-1;i<strlen(ini);p--,i++)
{
result[p]=ini[i]-'0';
ininum=ininum*10+result[p];
}
ininum--;
p=strlen(ini)-1;
int jin,high,max;
max=p;
for(;ininum>0;ininum--)
{
for(i=0;i<=p;i++)
result[i]*=ininum;
for(i=p,high=i;i>=0;i--,high=i)
{
while(result[high]>9)
{
jin=result[high]/10;
result[high]=result[high]%10;
high++;
result[high]+=jin;
if(high>max)
max=high;
}
}
p=max;
}
for(int j=max;j>=0;j--)
cout<<result[j];
}

2007-01-02 21:20
ffaannggqq
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2006-12-23
收藏
得分:0 

尝试一下用链表吧


2007-01-03 14:55
tutengwolf
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-12-2
收藏
得分:0 
连表太慢了吧
2007-01-04 12:56
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
以下是引用ffaannggqq在2007-1-1 19:09:11的发言:
那样早溢出了

什么溢出?为什么会溢出
不要妄下断言


2007-01-04 13:05
ffaannggqq
Rank: 1
等 级:新手上路
帖 子:40
专家分:0
注 册:2006-12-23
收藏
得分:0 

数组为int型,则数组的每一元素都在int范围内,若/10000,那若数组有一个数是90吧,那乘900得81000,那就溢出了,不是吗?


2007-01-06 13:01
快速回复:关于求1000!的代码
数据加载中...
 
   



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

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