什么是八进制到十六进制的测试用例会使以下程序失败?

Posted

技术标签:

【中文标题】什么是八进制到十六进制的测试用例会使以下程序失败?【英文标题】:What would be a octal to hex test case that would fail the following program? 【发布时间】:2018-11-19 16:29:38 【问题描述】:

我正在尝试编写一个程序,该程序接受一个最大为 8 的 200000 次方的非负八进制数。输入不会有任何前导零,并且输出不能包含任何额外的前导零。我想不出一个会失败的测试用例,但它肯定不是正确的答案。因此,我错过了一个边缘案例,我想知道是哪一个。我知道在此转换过程中可能会遇到一些“前导零”问题,但我不完全理解它的含义,因此无法看到问题/想出解决方案。

import java.util.*;
import java.io.*;

public class arithmetic
    public static void main(String[] args) throws Exception
        InputStreamReader ir = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(ir);
        String octal = br.readLine();
        if(octal == null)
            System.out.println("0");
            return;
        

        long decimal = Long.parseLong(octal,8);
        System.out.println(Long.toHexString(decimal).toUpperCase());

    

【问题讨论】:

您真的要允许 200,000 位八进制数吗?如果是,那么您的程序在long decimal = Long.parseLong(octal,8); 处失败,因为long 只有 64 位,而 200,000 位的八进制数是 600,000 位的精度。任何 23 位或更长的八进制数都会产生不正确的输出。 【参考方案1】:

尝试一个包含大量数字的八进制数。您的输入最多可以有 2000000。一个Java Long is only a 64-bit signed number。

您无法将足够大的八进制数放入任何 Java 基本类型,因此您需要一种完全不同的方法。

一种方法是读取 8 个八进制数字组(24 位)并将它们转换为 6 个十六进制数字组。

或查看this answer 了解有关 BigInteger 和 BigDecimal 的更多信息。

【讨论】:

我尝试了一个没有 long 的算法,但显然它仍然停留在同一个测试用例上。我尝试的算法是: for(int i = octal.length()-1; i >= 0; i--) decimal+= Integer.parseInt(Character.toString(octal.charAt(i))) * Math.战俘(8,计数);计数++;然后,我将其更改为 long,然后在其上使用 toHexString 添加了一点。 谢谢你的想法,我在它的前面添加了零,直到输入的长度为 0 模 4。然后,将它分成 4 块并将每一块更改为十六进制。它就是这样工作的。仍然不知道测试用例是什么,因为它不是我得到的 NumberFormatException,而只是一个直接的错误答案【参考方案2】:

这个问题大部分已经回答了,但他们还有一件事需要补充。

我知道在此转换过程中可能会遇到一些“前导零”问题。

这样不会有问题。前导零仅与源代码中的 Java 文字相关。 (前导零表示“八进制”...)


顺便说一句,您可以将一个大的八进制数(表示为字符)转换为十六进制,反之亦然,而无需转换为BigIntegerBigDecimal(或等效值)。但是您要么需要从数字字符串的最不重要(最右边)的一端开始,要么需要知道数字字符串中有多少个字符。

【讨论】:

以上是关于什么是八进制到十六进制的测试用例会使以下程序失败?的主要内容,如果未能解决你的问题,请参考以下文章

waitForTextverifyText和asserText命令

如何创建十六进制补码?

什么是Xcode中的嵌入式二进制文件?

XCTest 显示已删除测试的结果

video 标签在ios上怎么加载二进制流文件

修改汇编语言程序,添加功能 使其能完成以下功能