永发信息网

老是显示INTEGER_DIVIDE_BY_ZERO

答案:2  悬赏:0  手机版
解决时间 2021-01-29 02:39
  • 提问者网友:焚苦与心
  • 2021-01-28 04:37
是一道acm题,题目为FatMouse' Trade
贴下代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n,bytes,i,temp,h,bytess,r;
int *j,*f;
double *q,total,s;
scanf("%d%d",&m,&n);
bytes=sizeof(int)*n;
bytess=sizeof(double)*n;
j=(int*)malloc(bytes);
f=(int*)malloc(bytes);
q=(double*)malloc(bytess);
if (j==NULL||f==NULL||q==NULL)
return EXIT_FAILURE;
while(m!=-1&&n!=-1)
{
for(i=0;i<n;i++)
{
scanf("%d%d",j+i,f+i);
*(q+i)=(*(j+i))/(*(f+i));
}
for(i=0;i<n;i++)
{
temp=i;
for (h=1;h<n-i;h++)
{
if ((*(q+temp))<(*(q+i+h)))
temp=i+h;
}
r=*(j+i);
*(j+i)=*(j+temp);
*(j+temp)=r;
r=*(f+i);
*(f+i)=*(f+temp);
*(f+temp)=r;
}
if (*f>=m)
total=(m/(*f))*(*j);
else
{
total=0;
i=0;
s=m;
do
{
s-=(*(f+i));
total+=(*(j+i));
i++;
}
while (s>=(*(f+i))&&i-1<n);
if (s<(*(f+i))&&s>0)
total+=(s/(*(f+i)))*(*(j+i));
}
printf("%.3lf\n",total);
scanf("%d%d",&m,&n);
bytes=sizeof(int)*n;
bytess=sizeof(double)*n;
j=(int*)malloc(bytes);
f=(int*)malloc(bytes);
q=(double*)malloc(bytess);
if (j==NULL||f==NULL||q==NULL)
return EXIT_FAILURE;
}
return 0;
}

而且答案也不对- -实在不清楚哪里出错。麻烦大神帮我看看
最佳答案
  • 五星知识达人网友:平生事
  • 2021-01-28 05:28
INTEGER_DIVIDE_BY_ZERO是除零错。 分析你的程序,只有第36行有除法, answer = s1 / s2;按照你的程序逻辑,s2一定不为零, 但是你忽略了整数溢出的问题,溢出就会出错了。 因为int只能保存-2^31~+2^31-1范围内的数, 超过就会有问题。 n!是很容易超过int 的保存范围的。比如,int就不能保存70!的结果。 现在给你一个样例,是我精心设计的让你出现INTEGER_DIVIDE_BY_ZERO错误的: 7012 12 12 12 12 12 12 1211 11 11 11 11 11 11 11 11 1110 10 10 10 10 10 10 10 10 10 10 10 10 10 10 109 9 9 9 9 9 9 9 9 9 9 9 9 98 8 8 8 8 8 8 8 8 8 8 8 8 8 8 85 5 3 3 2 2 所以说, 这题应该是数论,有更好的办法解决的,不是暴力计算的。
全部回答
  • 1楼网友:杯酒困英雄
  • 2021-01-28 06:57
integer_divide_by_zero是除零错。 分析你的程序,只有第36行有除法, answer = s1 / s2;按照你的程序逻辑,s2一定不为零, 但是你忽略了整数溢出的问题,溢出就会出错了。 因为int只能保存-2^31~+2^31-1范围内的数, 超过就会有问题。 n!是很容易超过int 的保存范围的。比如,int就不能保存70!的结果。 现在给你一个样例,是我精心设计的让你出现integer_divide_by_zero错误的: 70 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5 5 3 3 2 2 所以说, 这题应该是数论,有更好的办法解决的,不是暴力计算的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯