为图像中的问题提供程序。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int N,R,A[100],B[100],i,flag=0;
double sol;
scanf("%d%d",&N,&R);
for(i=0;i<N;i++)
{
scanf("%d",&A[i]);
}
for(i=0;i<N;i++)
{
scanf("%d",&B[i]);
}
for(i=0;i<N;i++)
{
if(R>=A[i]&&R<=A[i+1])
{
sol=(double)R-(R*B[i])/100;
flag++;
}
}
if(flag==0)
{
sol=(double)R;
}
printf("%.2f",sol);
}
该程序通过了三个测试用例。但是失败了五。并显示预期输出3176.5,而实际输出为3177.0。如何清除所有案件。
答案 0 :(得分:3)
问题在这里:
sol=(double)R-(R*B[i])/100;
子表达式(R*B[i])/100
中的每个变量和常量的类型均为int
,因此结果也为类型int
。除法运算是整数除法,它会将结果截断。您在R
上进行的强制类型转换还不够,因为减法运算符的右侧操作数已经被评估为int
。
将常数100
更改为100.0
。这将为其赋予类型double
,这将导致除法为浮点除法。
sol=(double)R-(R*B[i])/100.0;
此外,以下比较将在最后一次迭代中读取到数组A
的末尾:
if(R>=A[i]&&R<=A[i+1])
您需要考虑最后一项的情况:
if((R>=A[i]) && ((i==N-1) || (R<=A[i+1])) )