在java中,第一个数组值乘以1,第二个数组值乘以3
第一次发帖,不便之处,敬请谅解 所以我正在做一个ISBN检查程序,但我一直在解决这个问题。我想把数组的第一个值乘以1,然后把第二个值乘以3,然后再乘以1,再乘以3,依此类推。以下是我目前的代码:在java中,第一个数组值乘以1,第二个数组值乘以3,java,arrays,Java,Arrays,第一次发帖,不便之处,敬请谅解 所以我正在做一个ISBN检查程序,但我一直在解决这个问题。我想把数组的第一个值乘以1,然后把第二个值乘以3,然后再乘以1,再乘以3,依此类推。以下是我目前的代码: String num = "9783453146976"; //split the string and save to a string array String[] splitNum = num.split(&qu
String num = "9783453146976";
//split the string and save to a string array
String[] splitNum = num.split("");
//create an int array to save the splitten strings after conversion
int[] intsNum = new int[num.length()];
for (int i = 0; i <= (num.length() - 2); i++)
{
intsNum[i] = Integer.parseInt(splitNum[i]);
System.out.print(intsNum[i]);
}
String num=“9783453146976”;
//拆分字符串并保存到字符串数组
字符串[]splitNum=num.split(“”);
//创建一个int数组以在转换后保存拆分字符串
int[]intsNum=新int[num.length()];
对于(int i=0;i,正如我在评论中所说,您在这里缺少的是:
一个条件乘法,基于数字的索引,假设我们从0(偶数索引)开始,我们应该应用1的乘法,然后到1(奇数索引)我们应用3的乘法,依此类推……这可以通过简单地检查索引%2是否返回0
(偶数)来实现或1
(奇数)
您需要将所有这些值相加,然后将其转换为控制数字,即,如果总和%10等于0
,则控制数字为0,否则为10-总和%10
如果我必须扩展您提供的代码,它将如下所示:
private static boolean checkISBN(String isbn) {
if (isbn == null || !isbn.matches("\\d{13}")) {
return false;
}
String[] splitNum = isbn.split("");
int sum = 0;
for (int i = 0; i <= (isbn.length() - 2); i++)
{
sum += Integer.parseInt(splitNum[i]) * (i % 2 == 0 ? 1 : 3);
}
return Integer.parseInt(splitNum[splitNum.length - 1]) == (sum % 10 == 0 ? 0 : 10 - sum % 10);
}
private static boolean checkISBN(String isbn) {
if (isbn == null || !isbn.matches("\\d{13}")) { // validat that the input contains of exactly 13 digits
return false;
}
// parse the digits as integers
int[] digits = Arrays.stream(isbn.split(""))
.mapToInt(s -> s.charAt(0) - '0')
.toArray();
// calcuate the control digit
int controlDigit = IntStream.range(0, digits.length - 1)
.mapToObj(i -> digits[i] * (i % 2 == 0 ? 1 : 3))
.reduce(Integer::sum)
.map(sum -> sum % 10 == 0 ? 0 : 10 - sum % 10)
.orElse(-1);
// validate the control digit
return digits[digits.length - 1] == controlDigit;
}
我猜您缺少最后一个元素,或者应用于给定的输入,最后一个数字被剪切-6
(num.length()-2)
是有问题的部分-通常您应该执行I
从零开始,即int i=0
。最后的6是前面数字的校验和。你将第一个数字乘以1,第二个数字乘以3,依此类推。然后你将它们相加,然后用下一个乘法10减去和,得到6。哦,我明白了。然后你缺少一个翻转乘法器和一个存储变量,即int mult=i%2==0?1:3;
,然后store(+=|*=)mult*intsNum[i];
,一旦完成循环,你就可以转换存储并得到答案。我希望这有帮助。谢谢,第一次看到这个。我会尝试一下,看看是否成功:)非常感谢它的工作。你给我的想法是,如果i%2==0;那么intsNum[i]*=1;else intsNum[i]*=3;它成功了。非常感谢:D