【问题标题】:UPC Code ProblemsUPC 代码问题
【发布时间】:2017-02-25 01:12:49
【问题描述】:

我一直试图找出为什么我的输出不是它应该是的。给出的样本是

输入 UPC(输入空行退出):036000291453 校验位 应该是:2 校验位是:3 UPC 无效

输入 UPC(输入空行退出):036000291452 校验位 应该是:2 校验位是:2 UPC 有效

输入 UPC(输入空行退出):014633149077 校验位 应该是:4 校验位是:7 UPC 无效

输入 UPC(输入空行退出):014633149074 校验位 应该是:4 校验位是:4 UPC 有效

输入 UPC(输入空行退出):0853911765722 错误! UPC 必须正好有 12 位数字

输入 UPC(输入空行退出):085391176572 校验位 应该是:2 校验位是:2 UPC 有效

输入 UPC(输入空行退出):再见!

得到该输出的算法是这样的 从左到右,将奇数位置的数字相加(从 1 开始计数)并将结果乘以 3。 从左到右,将偶数位置的数字添加到步骤 1 中计算的总数中 获取步骤 2 的结果并计算除以 10 的余数(结果模 10)。如果余数不为零,则从 10 中减去该余数以得到校验位。如果余数为零,则校验位应为 0。

    String str1 = validinput(in);
    int odd1 = odd(str1);
    int even1 = even(str1);
    int f = (odd1+even1)%10;
    if(f != 0){
        f = 10-f;
    }
    System.out.println(odd1);
    System.out.println(even1);

    System.out.println("Check digit should be: "+f);
    System.out.println("Check digit is: "+str1.charAt(11));
    int y = Character.getNumericValue(str1.charAt(11));
    if (f == y){
        System.out.println("UPC is valid");
    }
    else{
        System.out.println("UPC is not valid");
    }
}


private static String validinput(Scanner inScanner){

    System.out.print("Enter a UPC (enter a blank line to quit): ");
    String str = inScanner.nextLine();


    while(str.length() != 12){
        if (str.length() == 0){
            System.out.println("Goodbye");
            break;
        }
        else{
        System.out.println("ERROR! UPC MUST have exactly 12 digits");

        System.out.print("Enter a UPC (enter a blank line to quit): ");
        str = inScanner.nextLine();
        }
    }
    return str;
}


private static int odd(String input){
    int i = 1;
    char ch;
    int sumOdd = 0;
    while (i < 11){
        ch = input.charAt(i);
        int x = Character.getNumericValue(ch);
        sumOdd = x +sumOdd;
        i += 2;
    }
    int Mx3=sumOdd*3;
    return Mx3;
}


private static int even(String input){
    int i = 0;
    char ch;
    int sumEven = 0;
    while (i < 11){
        ch = input.charAt(i);
        int x = Character.getNumericValue(ch);
        sumEven = x +sumEven;
        i += 2;
    }

    return sumEven;
 }

【问题讨论】:

    标签: java checksum


    【解决方案1】:

    charAt() 使用基于 null 的索引,但指令希望您使用基于 1 的索引。因此,odd() 以 i = 0 开头。even() 以 i = 1 开头。

    其次,您使用Character.getNumericValue(ch) 获取字符的 unicode 代码点值,但说明要求您使用数字值。所以,请改用Integer.parseInt(ch.ToString())

    private static int odd(String input){
        int i = 0;
        char ch;
        int sumOdd = 0;
        while (i < 11){
            ch = input.charAt(i);
            int x = Integer.parseInt(ch.ToString());
            sumOdd = x +sumOdd;
            i += 2;
        }
        int Mx3=sumOdd*3;
        return Mx3;
    }
    
    
    private static int even(String input){
        int i = 1;
        char ch;
        int sumEven = 0;
        while (i < 11){
            ch = input.charAt(i);
            int x = Integer.parseInt(ch.ToString());
            sumEven = x +sumEven;
            i += 2;
        }
    
        return sumEven;
     }
    

    代码未测试

    【讨论】:

    • 感谢问题是奇偶。
    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多