我一整天都在努力训练这种情况,但没有运气。提前感谢您的帮助。
问题
您要实现的方法是将每个整数存储在一个数组中 数字,每个数组元素一位数。我们将使用数组 长度为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));
}
}
答案 0 :(得分:1)
当其他所有方法都失败时,请阅读说明:
“你要实现的方法是将每个整数存储在一个数字数组中,每个数组元素一个数字。我们将使用长度为50的数组,因此我们将能够存储长达50位的整数“。
告诉我这一行:
String[] myInts = new String[50];
有一些重大问题。
提示1:当它是一个String对象数组时,不要将其称为myInts。事情已经很难了。
提示2:明白new String[50]
不会给你一个大小为50个字符的字符串。它将为您提供存储50个字符串对象引用的空间。
提示3:了解输入的每一行都可以单独解决,因此无需记住以前解决过的行。
提示4:一次读一行String line;
提示5:读取一行后解决显示问题分为两部分:='s的左侧和右侧。
提示6:左侧:显示空格替换为空格+空格的行。 line.replace(" "," + ");
技巧7:右侧:使用line.split(" ")
分割空格线,循环分割的字符串数组,每个字符串都是你要转换为int数组的。
技巧8:“将数字字符串转换为50位数字”&lt; - 如果你编写一个执行此操作的方法,生活会更容易。拿一个字符串。返回一个int []。 private int[] makeIntArray(String num)
在此处理“正确转移/领先零”问题。
提示9:int和long不够大,无法容纳更大的数字,因此在转换为int []之前将数字字符串分解为数字字符串。
提示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:“编写一些代码,允许您将其中两个数字相加或将其中一个添加到另一个数字中。”仔细阅读,它告诉你,你真的需要宣布两个变量。 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长,因此在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
答案 1 :(得分:0)
提示#1 :使用0初始化数组。这样,处理文件时,您只需要将索引位置替换为从文件中获取的数字。
提示#2 :你必须做一些重复除以10和模数运算才能从数字中提取数字(如果你愿意,可以提取二进制)。例如,要分割来自&#39; 27&#39;的数字,您可以执行27 % 10
(7)和27 / 10
(2)。这里的关键是将结果存储为int
。毕竟,每个数字都是一个整数(不是浮点数)。对于更大幅度的数量,您将需要丢弃过程数字位置,以使数字变小。现在,当你完成时,除法的商等于零。因此,您可以在伪代码中说:DIVIDE number by 10 WHILE number&gt; 0(类似的东西)
提示#3 ,您必须反向迭代才能将数字存储在数组中。如果数组的长度为50,则以LENGTH-1开始,并向下计数到ZER0。
提示#4 :如果问题允许,请使用ints
数组,而不是Strings
数组。使用Integer.parseInt(String s)
将数字字符串转换为基元int
。
答案 2 :(得分:0)
我认为问题是在将所有单词读入同一个数组时,将每个数字读入不同的标准大小数组。并且逐行处理这个也是好的
类似这样的事情
Scanner scanner = new Scanner(file);
int[][] myInts = new int[wordSize][];
int mySpot = 0;
while (scanner.hasNextLine()) {
Scanner scanner1 = new Scanner(scanner.nextLine());
while (scanner1.hasNext()) {
String s = scanner1.next();
int i;
for ( i= 0; i < wordSize - s.length(); i++) {
myInts[i][mySpot] = 0;
}
i--;
for (int j=0;j < s.length(); i++,j++) {
myInts[i][mySpot] = Character.digit(s.charAt(i), 10);
}
mySpot++;
}
// do the additions here and add this line to output file
}