繁体   English   中英

我的代码对于两个特定的输入测试都失败了。 “无溢出”和“大整数溢出”

[英]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^31int可以存储的“最大”数字。

如果您 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM