我整天都在尝试锻炼身体,但是没有运气。在此先感谢您的帮助。

这是问题所在


您要实现的方法是将每个整数存储在数组中
位数,每个数组元素一位。我们将使用数组
长度为50,所以我们将能够存储最多50个数字的整数
长。我们在存储这些数字时必须小心。考虑,
例如,存储数字38423和27。如果我们将其存储在
数组的“前部”,其中每个数字的前导数字
数组的索引0,那么当我们将这些数字加在一起时,
我们可能会像这样添加它们:

38423

27

为了模拟值的这种右移,我们将每个值存储为
完全由50位数字组成的序列,但我们允许数字具有
前导0。例如,上面的问题转换为:

0000000000000000000038423

0000000000000000000000027

现在,各列已正确对齐,并且在
万一我们有更长的数字要添加到这些。

程序的数据将存储在名为sum.txt的文件中。
输入文件的每一行都会有一个不同的加法问题
你解决。每行将添加一个或多个整数
一起。看一下本文结尾处的输入文件
以及您应该产生的输出。请注意,您产生了一个
每个输入行的输出行显示您的加法问题
正在解决及其答案。您的输出还应该在
结束处理了多少行输入。您必须准确复制
此输出。

您应该使用第6章中介绍的技术来打开文件,
逐行读取它并处理每一行的内容。在
阅读这些数字,您将无法阅读它们为整数或多头
因为它们很多太大而无法存储在int或long中。所以
您必须使用方法的调用将它们读取为字符串值
下一个()。然后,您的第一个任务是转换数字字符串
转换成50位数字的数组。如上所述,您需要转移
右边的数字,并在前面加上前导0。弦乐
方法charAt和方法Character.getNumericValue会有所帮助
解决这部分问题。

您需要将每一行数字相加,这意味着您将拥有
编写一些代码,使您可以将其中两个加在一起
数字或将其中一个添加到另一个。这是你的事
从小学中学到的,从右边开始添加,保持
跟踪是否有一位数字要从一列传送到
下一个。您面临的挑战是采取您熟悉的流程
用和编写执行相应任务的代码。

您的程序还必须写出这些数字。这样做时,应该
不打印任何前导0。即使方便存放
内部数字前导0,阅读您的输出的人会
宁可查看这些数字,也不要带任何前导0。

您可以假定输入文件的数字等于或小于50
位数,并且答案始终是50位数或更少。注意,
但是,您必须处理个人的可能性
数字可能为0或答案可能为0。不会有否定的答案
输入文件中的整数。

您应该使用正好为50位数字的数组来解决此问题
长。某些错误可以通过将数组扩展为某种东西来解决
例如51位数字,但不必这样做,您会
如果您的数组需要超过50位数字,则会丢失样式点。

数字位数选择50是任意的(魔术
数字),因此您应该引入一个使用的类常量
整个过程将很容易修改您的代码以进行操作
不同数量的数字。

以输入文件为例,说明您遇到的问题
程序必须解决。我们可能会使用更复杂的输入文件
等级。

Java类库包括名为BigInteger和
BigDecimal使用与我们要求您类似的策略
在此程序中实施。您无权解决此问题
使用BigInteger或BigDecimal。您必须使用以下数组解决它
数字。

您的程序应存储在名为Sum.java的文件中。


输入文件sum.txt

82384
204 435
22 31 12
999 483
28350 28345 39823 95689 234856 3482 55328 934803
7849323789 22398496 8940 32489 859320
729348690234239 542890432323 534322343298
3948692348692348693486235 5834938349234856234863423
999999999999999999999999 432432 58903 34
82934 49802390432 8554389 4789432789 0 48372934287
0
0 0 0
7482343 0 4879023 0 8943242
3333333333 4723 3333333333 6642 3333333333


应产生的产出

82384 = 82384
204 + 435 = 639
22 + 31 + 12 = 65
999 + 483 = 1482
28350 + 28345 + 39823 + 95689 + 234856 + 3482 + 55328 + 934803 = 1420676
7849323789 + 22398496 + 8940 + 32489 + 859320 = 7872623034
729348690234239 + 542890432323 + 534322343298 = 730425903009860
3948692348692348693486235 + 5834938349234856234863423 = 9783630697927204928349658
999999999999999999999999 + 432432 + 58903 + 34 = 1000000000000000000491368
82934 + 49802390432 + 8554389 + 4789432789 + 0 + 48372934287 = 102973394831
0 = 0
0 + 0 + 0 = 0
7482343 + 0 + 4879023 + 0 + 8943242 = 21304608
3333333333 + 4723 + 3333333333 + 6642 + 3333333333 = 10000011364


总行数= 14

到目前为止我的代码

public class Sum {

    public static void main(String args[]) throws FileNotFoundException{
        File file = new File("sum.txt");
        Scanner scanner = new Scanner(file);
        String[] myInts = new String[50];
        int mySpot = 0;
        while(scanner.hasNext()){
            myInts[mySpot] = scanner.next();
            mySpot++;
        }
        for(int i = 0; i < myInts.length; i++){
        }
        System.out.println(Character.getNumericValue(myInts[0]));
        System.out.println(Arrays.toString(myInts));
    }
}

最佳答案

当其他所有方法均失败时,请阅读说明:

“您要实现的方法是将每个整数存储在一个数字数组中,每个数组元素一个数字。我们将使用长度为50的数组,因此我们将能够存储最长50个数字的整数。”

告诉我这一行:

String[] myInts = new String[50];

有一些重大问题。

提示1:当它是String对象的数组时,请勿将其称为myInts。事情已经够困难了。

提示2:了解new String[50]不会给您一个大小为50个字符的字符串。它将为您提供存储对50个字符串对象的引用的空间。

提示3:了解输入的每一行都可以单独求解,因此您无需记住之前已求解的行中的任何内容。

提示4:一次读入String line;

提示5:读取一行后,请分两部分解决显示问题:=的左侧和右侧。

提示6:左侧:显示用空格+空格替换空格的行。 line.replace(" "," + ");

技巧7:右侧:使用line.split(" ")在空间上分割线,循环分割的字符串数组,这些字符串中的每一个都是要转换为int数组的内容。

提示8:“将数字字符串转换为50位数字的数组” private int[] makeIntArray(String num)在这里解决“右移/前导零”问题。

提示9:int和long不足以容纳更大的数字,因此在转换为int []之前将数字String分解为数字字符串。

技巧10:阅读Splitting words into letters in Java

提示11:阅读Split string into array of character strings

提示12:一旦您拥有单个字符,就可以将Integer.parseInt(singleCharString[index--])分解为字符串数组,或者将Character.digit( chr[index--], 10);分解为字符串数组。

提示13:“编写一些代码,使您可以将这些数字中的两个加起来或将其中一个加到另一个上。”仔细阅读该书,它会告诉您确实需要声明两个var。 int[] sum = new sum[SIZE];int[] next = new next[SIZE];,其中大小为private final static int SIZE = 50;

提示14:将两个int []数字相加以产生新的int []将是制作方法的另一个好时机。 int[] sum(int[] op1, int[] op2)

提示15:由于我们所有的int []都已经右移,并且总是50长,所以在i为49时开始循环,然后递减计数。 result[i-1] = (op1[i] + op2[i] + carry) % 10;carry = (op1[i] + op2[i] + carry) / 10将派上用场。确保在1处停止循环,否则[i-1]会使索引超出范围。

提示16:测试,测试然后再次测试。进行较小的更改,然后进行测试。零钱,测试。不要只是打字和祈祷。如果您愿意,请使用调试器,但我个人更喜欢检查类似System.out.println("line: " + line);//TODO remove debugging code的值

07-24 09:37
查看更多