本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。

我的程序如下#include<stdio.h>int main(){ int n,t,k; scanf("%d",&n); double fenzi,fenmu,sum; fenmu=1; fenzi=2; t=1; sum = 0; while(t<n+1){ sum += fenzi/fenmu; k=fenzi+fenmu; fenmu = fenzi; fenzi = k; t++; }printf("%.2f",sum); return 0;} 系统测试结果如图麻烦大神帮我找下错误吧谢谢!!!!!

首先需要明确,常常看到int取值范围为-32768~32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,取值范围为前面所说的-32768~32767(-2^16~2^16-1)。

而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-2^32~2^32-1)。

本题中当N为44时,分子的取值将达到2971215073,超出int取值范围(2147483647),出现异常,导致计算结果出错,也就是PTA中判断的较大N出错。

N<44时一切正常,当N=44时,分子值因为超出int取值范围出现错误。因此本题中,fm,fz,t应为double类型。

扩展资料:

在计算机系统中,一条机器指令规定了计算机系统的一个特定动作。一个系列的计算机在硬件设计制造时就用了若干指令规定了该系列计算机能够进行的基本操作,这些指令一起构成了该系列计算机的指令系统。

在计算机应用的初期,程序员使用机器的指令系统来编写计算机应用程序,这种程序称为机器语言程序。

使用机器语言编写的程序,由于每条指令都对应计算机一个特定的基本动作,所以程序占用内存少、执行效率高。缺点也很明显,如:编程工作量大,容易出错;依赖具体的计算机体系,因而程序的通用性、移植性都很差。

参考资料来源:百度百科-编程

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-01-06

程序非常复杂,而且比较乱。

给出本题代码:

#include <stdio.h>

void main()
{
int i,n,a[1000]={1,1};
double sum=0;
scanf("%d",&n);
for(i=2;i<n+2;i++)
{
a[i]=a[i-1]+a[i-2];
sum+=(float)a[i]/(float)a[i-1];
}
printf("%.2f",sum);
}

运行示例:

追问

追答

程序无误。编译运行正常。
请完整按我的代码输入,不要擅自乱改。

追问

我没有改过你的代码哈 直接上的PTA检查哈

追答

应该早注明是PTA
void改int,最后加return 0;
a[1000]改a[50]
试一下看看。
PTA不是一般正常的编程系统,不知道哪里就会有坑。

追问

呃 我按照你的方法改了你的程序之后就和我的错误一样了 可以看看我叙述的问题

追答

你把你的程序和我的程序,分别算n=50的情况。

追问

但是最后显示成这样。。

其实我有点看不太懂你的程序呃。。。

是你这种计算方法可以准确的表达分数的意思吗?

我只学到循环这。。

不过谢谢你了!

本回答被提问者和网友采纳
第2个回答  2018-08-01

首先需要明确,我们常常看到int取值范围为-32768~32767,实际上int的取值范围依赖于计算机系统,在16位机器中,int占16位,取值范围为前面所说的-32768~32767(-2^16~2^16-1)。而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-2^32~2^32-1)。

本题中当N为44时,分子的取值将达到2971215073,超出int取值范围(2147483647),出现异常,导致计算结果出错,也就是PTA中判断的较大N出错,验证程序如下:

#include<stdio.h>
int main(void)
{
int fm=1,fz=2,t,N,count; /*fm=分母;fz=分子*/
double i,sum=0.0;
scanf("%d",&N);
for(count=1;count<=N;count++){
i=1.0*fz/fm;
sum=sum+i;
t=fm+fz;
fm=fz;
fz=t;
printf("当N=%d时\n分母=%d\n分子=%d\n\n",count,fm,fz);

return 0;
}

可以看到,N<44时一切正常,当N=44时,分子值因为超出int取值范围出现错误。因此本题中,fm,fz,t应为double类型,参考答案为:

#include<stdio.h>
int main(void)
{
int N,count;
double fm=1,fz=2,i,sum=0,t;
scanf("%d",&N);
for(count=1;count<=N;count++){
i=1.0*fz/fm;
sum=sum+i;
t=fm+fz;
fm=fz;
fz=t;

printf("%.2f\n",sum);
return 0;
}

PTA C语言题目集,浙江大学C语言教材及配套实验教材习题答案,以及相关学习笔记,欢迎关注收藏(有道云笔记),不断更新ing~

第3个回答  2018-02-08

为什么这个运行时间过长呢?

第4个回答  2018-01-24

int 和 double 的范围 不一样, N 太大的时候用int可能会超过边界。

#include <stdio.h>

int main(void)
{
double a=2,b=1,t;
int N;
double sum=0;
int cnt=0; 

scanf("%d", &N);
while(cnt<N)
{
sum += a/b;
t = a;
a = a+b;
b = t;
cnt++;
}
printf("%.2f\n", sum);

return 0;
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网