两道考试题,急求助!

HellotoYou 2004-04-27 08:33:29
1.从键盘上或文本文件中输入n及n个实型数 (各数字用空格隔开,n<40),存入数组bb[40]中。利用选择排序法对bb排序后, 在屏幕上或文件中输出排序后的数据。 然后,再输入一个实型数x,利用二分查找判断x是否在数组bb[40]中,若是,输出x所在位置,否则显示“No”。 要求用两个函数实现主要操作:(1)fsort():排序,(2)binsearch():二分查找。
2. 计算e=1+1/1!+1/2!+1/3!+. . .,由键盘输入N(<1000),表示要精确到小数点后第N位。
利用文本文件输出结果,每一行输出50位。

环境为TC2.0
第一道题主要不知道如何从文本中读入实数。
第二道题则对如何计算完全不知道。
...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
haoyi 2004-04-28
  • 打赏
  • 举报
回复
在精度以内应该没问题的
haoyi 2004-04-28
  • 打赏
  • 举报
回复
给你一个好点子
把1/n!换成(1/2)*(1/3)*(1/4)*.....*(1/n)
迭代就可以了啊!!!
HellotoYou 2004-04-28
  • 打赏
  • 举报
回复
sos!
xdspower 2004-04-28
  • 打赏
  • 举报
回复
第2题光算N!一般系统不到N=20可能就溢出了啊,而且题意确实不明确啊。
hwbin2008 2004-04-28
  • 打赏
  • 举报
回复
第一题你就留着自已弄吧,比较简单
后一个,想个好点的算法才是重要
blvssss 2004-04-28
  • 打赏
  • 举报
回复
e=1+1/1!+1/2!+1/3!+. . .好象其实就是PI啊,有经典的外星人算法

long a=10000,b,c=2800,d,e,f[2801],g;
main(){for(;b-c;)f[b++]=a/5;
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b);}
zhouqingyuan 2004-04-27
  • 打赏
  • 举报
回复
2. 计算e=1+1/1!+1/2!+1/3!+. . .,由键盘输入N(<1000),表示要精确到小数点后第N位。
利用文本文件输出结果,每一行输出50位。

精确到小数点后第N位,不知道,个人也觉得这种题目有些bt的!!!有空研究这种题目
还不如把时间花在其他的地方。
HellotoYou 2004-04-27
  • 打赏
  • 举报
回复
我不知道为什么数弄得着么大。
我想用数组解决,但却感觉数组除数组更不知如何下手了。
下面的小程序Tc2.0下n=7,vc下n=17还可以,但结果就不知对错了。
望高手点破迷津。
-----------------------------------------------------------------
#include <stdio.h>

void func(int n1,int n2,int *b,int n)
{ int i;
for(i=0;i<n;i++)
*(b+i)=0;
if(n1/n2!=0) { *(b+0)=n1/n2; n1%=n2; } /*integer part*/
for(i=1;i<n && n1!=0;i++)
{ n1*=10;
if(n1/n2!=0) *(b+i)=n1/n2;
n1%=n2;
}
}

void main()
{
int a[1000],b[1000];
int i,j,n;
long tmp=1;

for(i=0;i<1000;i++) a[i]=0;
printf("\nplease input precision N(>=2):"); scanf("%d",&n);
if(n==1) { printf("\ne=2.0"); exit(-1); }
a[0]=1; /* a0=e (1)*/
for(i=1;i<n;i++)
{ tmp*=i;
func(1,tmp,b,n);
for(j=0;j<n;j++)
{ a[j]+=b[j];
if(a[j]>=10)
{ a[j-1]++; a[j]-=10; }
}
}
printf("\ne=%d.",a[0]);
for(i=1,j=0;i<n;i++)
{ printf("%d",a[i]);
if(++j==50)
{ printf("\n%4s"," ");
j=0;
}
}
}
----------------------------------------------------------------
zhangfjj 2004-04-27
  • 打赏
  • 举报
回复
/*2. 计算e=1+1/1!+1/2!+1/3!+. . .,由键盘输入N(<1000),表示要精确到小数点后第N位。
利用文本文件输出结果,每一行输出50位
double型数据的精度是15-16位,
即使是long double型,精度也不会有很多(它只分配10个字节的存储单元呀
如果要精确到100位开外,我认为是有难度的,就象论坛上看到过的100000的阶乘之类的问题,用常规
方法怕是无法解决的。
楼上写的程序有点问题
double e = 0.0;
int n;
double temp = 1;
for(int i=0; i<n; i++)//i不能从0开始
{
temp *= i;
e += 1/temp;
}
这是常规方法,是迭代吧!

*/
HellotoYou 2004-04-27
  • 打赏
  • 举报
回复
to jmlt1983(Harper):
我想应该是N的阶乘
jmlt1983 2004-04-27
  • 打赏
  • 举报
回复
第2题没说明白啊,保证N位精度,但是要计算到几的阶乘才好啊
bm1408 2004-04-27
  • 打赏
  • 举报
回复
打击作业!
HellotoYou 2004-04-27
  • 打赏
  • 举报
回复
freefalcon(心宇) :

老大,你给的第二题的解答能否保证N位的精度?
小弟不明白,希望能给解释一下。
liushuaiboy 2004-04-27
  • 打赏
  • 举报
回复
n<1000,楼上的不会溢出吗?
freefalcon 2004-04-27
  • 打赏
  • 举报
回复
1.fscanf(FILE *, const char *, ...)
float f;
fscanf(fp, "%f", &f);

2.
double e = 0.0;
int n;
double temp = 1;
for(int i=0; i<n; i++)
{
temp *= i;
e += 1/temp;
}

69,373

社区成员

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

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