首先需要明确,常常看到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类型。
扩展资料:
在计算机系统中,一条机器指令规定了计算机系统的一个特定动作。一个系列的计算机在硬件设计制造时就用了若干指令规定了该系列计算机能够进行的基本操作,这些指令一起构成了该系列计算机的指令系统。
在计算机应用的初期,程序员使用机器的指令系统来编写计算机应用程序,这种程序称为机器语言程序。
使用机器语言编写的程序,由于每条指令都对应计算机一个特定的基本动作,所以程序占用内存少、执行效率高。缺点也很明显,如:编程工作量大,容易出错;依赖具体的计算机体系,因而程序的通用性、移植性都很差。
参考资料来源:百度百科-编程
程序非常复杂,而且比较乱。
给出本题代码:
#include
void main()
{
int i,n,a[1000]={1,1};
double sum=0;
scanf("%d",&n);
for(i=2;i{
a[i]=a[i-1]+a[i-2];
sum+=(float)a[i]/(float)a[i-1];
}
printf("%.2f",sum);
}
运行示例:
首先需要明确,我们常常看到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
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
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~
为什么这个运行时间过长呢?
int 和 double 的范围 不一样, N 太大的时候用int可能会超过边界。
#include
int main(void)
{
double a=2,b=1,t;
int N;
double sum=0;
int cnt=0;
scanf("%d", &N);
while(cnt{
sum += a/b;
t = a;
a = a+b;
b = t;
cnt++;
}
printf("%.2f\n", sum);
return 0;
}
网页链接