[英]My code is failing for two specific input tests. "No overflow" and "Big integers overflow"
第 1 部分给定 4 个整数,output 它们的乘积及其平均值,使用 integer 算法。
例如:如果输入是:
8 10 5 4 output 是:
1600 6 注:Integer 除法舍弃小数。 因此 8 10 5 4 的平均值是 output 作为 6,而不是 6.75。
注意:测试用例包括四个非常大的输入值,其乘积导致溢出。 您无需执行任何特殊操作,只需观察 output 并不代表正确的产品(事实上,四个正数产生一个负数 output;哇)。
在您完成下面的第 2 部分之前,您的程序将无法通过最后的测试用例(这是预期的)。 保留这些陈述,但也添加第 2 部分的陈述。
第 2 部分也是 output 的乘积和平均值,使用浮点运算。
Output 每个小数点后三位的浮点数,实现方式如下: System.out.printf("%.3f", yourValue);
例如:如果输入是 8 10 5 4,则 output 是:
1600 6 1600.000 6.750 请注意,分数不会被丢弃,并且对于具有大值的测试用例不会发生溢出。
import java.util.Scanner;
public class ProgrammingAssignment1 {
public static void main(String[] args) {
Scanner scnr = new Scanner(System.in);
int int1;
int int2;
int int3;
int int4;
int1 = scnr.nextInt();
int2 = scnr.nextInt();
int3 = scnr.nextInt();
int4 = scnr.nextInt();
//pt 1
double product = ((double) int1) * int2 * int3 * int4;
double average = (int1+int2+int3+int4)/4.0;
//pt 2
int result1 = (int) average;
int result2 = (int) product;
System.out.printf("%d %d\n",result2,result1);
System.out.printf("%.3f %.3f\n",product,average);
}
}
这是我的代码。 这些测试特别失败。 否则它运行良好。 Output 不同。 请参阅下面的要点。 Input 100000 200000 300000 500000 Your output 2147483647 275000 3000000000000000000000.000 275000.000 Expected output -1679818752 275000 3000000000000000000000.000 275000.000
和
Output 不同。 请参阅下面的要点。 特殊字符图例 输入 100000 200000 300000 500000 你的 output 以 2147483647 275000 300000000000000000000.000 275000.000 预期 88343710633165028 以-1757062165028 开头
我试过操纵变量类型。 但没有运气
您不是在使用 integer 算术,而是在进行double
算术。
存储在计算机中的任何数字的问题在于,除非您注册让它使用的 memory 可能会增长到无限大小(而且我们还没有发明具有无限 memory 的计算机,所以这是一个问题),你是不得不将它们存储在固定的“大小”中。 int
是 32 位, double
是 64 位。 无论如何,32 位的数据最多只能存储 2 的 32 次方不同的值。 双精度数,假设它们是 64 位的,最多可以存储2^64
不同的唯一值。 出于同样的原因 1 加 1 是 2 - 基本的数学性质。
对于 int/long,选择的值都是“接近 0”的整数,即正数2^31-1
和负数-2^31
是int
可以存储的“最大”数字。
如果您 go “越过”边缘,数字会环绕。 这就是int
/ long
在您尝试进行需要比您更多的位的数学运算时“解决”问题的方式。
相反,对于double
,数字行上的某些特定数字被“祝福”以表示,并且任何其他结果都四舍五入到最接近的祝福数字。 当您远离 0(即越来越大的数字)时,有福数字越来越少。 大约 2^52,任意 2 个有福数字之间的距离大于 1,甚至。 这确实意味着double
可以表示非常非常大的数字。 只是,有很多错误(正如我所说,双重数学默默地四舍五入到最接近的祝福数字。如果任何 2 个祝福数字之间的差距很大,而且它们是大数字,所有四舍五入加起来会产生很多错误) . 这就是当你 go 超出它的位合理让你做的事情时double
解决问题的方式:大量的舍入,如果你 go 足够远,你最终会得到一个称为NaN
的数字(不是数字)。
因此,对于double
,结果随着错误级别的增加而关闭,甚至是NaN
。 它永远不会“溢出”(翻转到数字线的另一端)。
你在做双重数学,因此你为什么没有看到“溢出”的数学错误。 您正在观察舍入版本。
按照练习的要求使用所有积分数学。 要获得平均值:
int product = int1 * int2 * int3 * int4;
int average = (int1+int2+int3+int4)/4;
是的,平均值现在是“错误的”,但问题明确表明这是期望的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.