什么是八进制到十六进制的测试用例会使以下程序失败?
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 文字相关。 (前导零表示“八进制”...)
顺便说一句,您可以将一个大的八进制数(表示为字符)转换为十六进制,反之亦然,而无需转换为BigInteger
或BigDecimal
(或等效值)。但是您要么需要从数字字符串的最不重要(最右边)的一端开始,要么需要知道数字字符串中有多少个字符。
【讨论】:
以上是关于什么是八进制到十六进制的测试用例会使以下程序失败?的主要内容,如果未能解决你的问题,请参考以下文章