为什么这段Java代码计算正确,但输出的答案却是错误的?

huangapple go评论94阅读模式
英文:

Why this Java code counts correct but prints the wrong answer?

问题

以下是您提供的Java代码的翻译部分:

  1. 我已经创建了一个小型的Java程序用来检查给定的程序是否包含和以下是我的代码
  2. import java.util.Scanner;
  3. public class SubarraySum{
  4. static void find_position(Long[] array, int size, Long find_sum){
  5. Long sum = 0L;
  6. boolean b = false;
  7. int c=0,d=0;
  8. for(int i=0;i<size; i++){
  9. if(sum == find_sum){
  10. System.out.println((c+1)+" "+(d+1));
  11. b = true;
  12. break;
  13. }
  14. sum = 0L;
  15. for(int j=i;j<size; j++){
  16. sum += array[j];
  17. System.out.println(i+": "+sum+" : "+b);
  18. if(sum == find_sum){
  19. c = i; d = j;
  20. // System.out.println((c+1)+" "+(d+1));
  21. System.out.println((c+1)+" "+(d+1));
  22. b = true;
  23. // System.out.println(i+": "+sum+" : "+b);
  24. // System.exit(0);
  25. break;
  26. }
  27. // System.out.println(i+": "+sum+" : "+b);
  28. if(sum > find_sum) break;
  29. }
  30. }
  31. if(b == false){
  32. System.out.println("-1");
  33. }
  34. }
  35. static void takeSizeandSum(Scanner sc){
  36. int size = sc.nextInt();
  37. Long find_sum = sc.nextLong();
  38. Long[] array = new Long[size];
  39. for(int i=0;i<size;i++){
  40. array[i] = sc.nextLong();
  41. }
  42. find_position(array, size, find_sum);
  43. }
  44. public static void main(String[] args) {
  45. Scanner sc = new Scanner(System.in);
  46. int TestCase = sc.nextInt();
  47. for(int i=0;i<TestCase;i++){
  48. takeSizeandSum(sc);
  49. }
  50. }
  51. }
  52. 它在这种情况下打印出错误的输出
  53. 1
  54. 42 468
  55. 135 101 170 125 79 159 163 65 106 146 82 28 162 92 196 143 28 37 192 5 103 154 93 183 22 117 119 96 48 127 172 139 70 113 68 100 36 95 104 12 123 134
  56. 对于这个输入它打印出-1”,而正确的答案是38 42
  57. 我已经更改了我的find_position代码
  58. static int find_position(int[] array, int size, int find_sum){
  59. int i, j;
  60. int sum;
  61. for(i =0;i<size; i++){
  62. sum = array[i];
  63. for(j=i+1;j<size;j++){
  64. if(sum == find_sum){
  65. int c = j-1;
  66. System.out.println(i +" "+c);
  67. return 1;
  68. }
  69. if(sum > find_sum || j==size){
  70. break;
  71. }
  72. sum += array[j];
  73. }
  74. }
  75. System.out.println("-1");
  76. return 0;
  77. }
  78. 然而它仍然显示错误的输出您能帮我解决吗
英文:

I have created one small Java program to check that given programs contains the sum or not. Here is my code:

  1. import java.util.Scanner;
  2. public class SubarraySum{
  3. static void find_position(Long[] array, int size, Long find_sum){
  4. Long sum = 0L;
  5. boolean b = false;
  6. int c=0,d=0;
  7. for(int i=0;i&lt;size; i++){
  8. if(sum == find_sum){
  9. System.out.println((c+1)+&quot; &quot;+(d+1));
  10. b = true;
  11. break;
  12. }
  13. sum = 0L;
  14. for(int j=i;j&lt;size; j++){
  15. sum += array[j];
  16. System.out.println(i+&quot; : &quot;+sum+&quot; : &quot;+b);
  17. if(sum == find_sum){
  18. c = i; d = j;
  19. // System.out.println((c+1)+&quot; &quot;+(d+1));
  20. System.out.println((c+1)+&quot; &quot;+(d+1));
  21. b = true;
  22. // System.out.println(i+&quot; : &quot;+sum+&quot; : &quot;+b);
  23. // System.exit(0);
  24. break;
  25. }
  26. // System.out.println(i+&quot; : &quot;+sum+&quot; : &quot;+b);
  27. if(sum &gt; find_sum) break;
  28. }
  29. }
  30. if(b == false){
  31. System.out.println(&quot;-1&quot;);
  32. }
  33. }
  34. static void takeSizeandSum(Scanner sc){
  35. int size = sc.nextInt();
  36. Long find_sum = sc.nextLong();
  37. Long[] array = new Long[size];
  38. for(int i=0;i&lt;size;i++){
  39. array[i] = sc.nextLong();
  40. }
  41. find_position(array, size, find_sum);
  42. }
  43. public static void main(String[] args) {
  44. Scanner sc = new Scanner(System.in);
  45. int TestCase = sc.nextInt();
  46. for(int i=0;i&lt;TestCase;i++){
  47. takeSizeandSum(sc);
  48. }
  49. }
  50. }

It prints wrong output in this case:

  1. 1
  2. 42 468
  3. 135 101 170 125 79 159 163 65 106 146 82 28 162 92 196 143 28 37 192 5 103 154 93 183 22 117 119 96 48 127 172 139 70 113 68 100 36 95 104 12 123 134

For this input it prints -1 while correct answer is 38 42!

I have changed my find_position code :

  1. static int find_position(int[] array, int size, int find_sum){
  2. int i, j;
  3. int sum;
  4. for(i =0;i&lt;size; i++){
  5. sum = array[i];
  6. for(j=i+1;j&lt;size;j++){
  7. if(sum == find_sum){
  8. int c = j-1;
  9. System.out.println(i +&quot; &quot;+c);
  10. return 1;
  11. }
  12. if(sum &gt; find_sum || j==size){
  13. break;
  14. }
  15. sum += array[j];
  16. }
  17. }
  18. System.out.println(&quot;-1&quot;);
  19. return 0;
  20. }

However, it still displays wrong output. Can you help me out?

答案1

得分: 0

  1. public class SubarraySum {
  2. // 通常你会创建一个包含起始和结束索引的类,但我现在只返回一个字符串
  3. public static String findPosition(long[] array, long sumToFind) {
  4. for (int startIndex = 0; startIndex < array.length; startIndex++) {
  5. long sum = 0;
  6. for (int endIndex = startIndex; endIndex < array.length; endIndex++) {
  7. sum += array[endIndex];
  8. if (sum == sumToFind) {
  9. // 返回基于1的索引
  10. return String.format("(%d, %d)", startIndex + 1, endIndex + 1);
  11. } else if (sum > sumToFind) {
  12. // 提前结束此检查,因为我们不能再添加值以达到较小的sumToFind
  13. break;
  14. }
  15. }
  16. }
  17. return "-1";
  18. }
  19. public static void takeSizeAndSum(Scanner sc) {
  20. int size = sc.nextInt();
  21. long sumToFind = sc.nextLong();
  22. long[] array = new long[size];
  23. for (int i = 0; i < size; i++) {
  24. array[i] = sc.nextLong();
  25. }
  26. System.out.println(findPosition(array, sumToFind));
  27. }
  28. public static void main(String[] args) {
  29. Scanner sc = new Scanner(System.in);
  30. int testCases = sc.nextInt();
  31. for (int i = 0; i < testCases; i++) {
  32. takeSizeAndSum(sc);
  33. }
  34. }
  35. }
英文:

For your learning experience, using long. I've also formatted the code, used more logical and Java-like identifiers, removed a lot of unnecessary ones, split lines, added some comments, removed the debugging code, removed the unnecessary size parameter (arrays carry their `.length), split the calculation and the input / output, etc.

  1. public class SubarraySum {
  2. // generally you&#39;d create a class with the start- and end index but
  3. // I&#39;ll just return a string for now
  4. public static String findPosition(long[] array, long sumToFind) {
  5. for (int startIndex = 0; startIndex &lt; array.length; startIndex++) {
  6. long sum = 0;
  7. for (int endIndex = startIndex; endIndex &lt; array.length; endIndex++) {
  8. sum += array[endIndex];
  9. if (sum == sumToFind) {
  10. // return 1 based index
  11. return String.format(&quot;(%d, %d)&quot;, startIndex + 1, endIndex + 1);
  12. } else if (sum &gt; sumToFind) {
  13. // end this check early, as we cannot add more values and get to a smaller sumToFind
  14. break;
  15. }
  16. }
  17. }
  18. return &quot;-1&quot;;
  19. }
  20. public static void takeSizeandSum(Scanner sc) {
  21. int size = sc.nextInt();
  22. long sumToFind = sc.nextLong();
  23. long[] array = new long[size];
  24. for (int i = 0; i &lt; size; i++) {
  25. array[i] = sc.nextLong();
  26. }
  27. System.out.println(findPosition(array, sumToFind));
  28. }
  29. public static void main(String[] args) {
  30. Scanner sc = new Scanner(System.in);
  31. int testcases = sc.nextInt();
  32. for (int i = 0; i &lt; testcases; i++) {
  33. takeSizeandSum(sc);
  34. }
  35. }
  36. }

huangapple
  • 本文由 发表于 2020年10月10日 18:24:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/64292378.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定