为了账号安全,请及时绑定邮箱和手机立即绑定

无法将 ascii 121 打印到字符 y,而是打印一个特殊字符

无法将 ascii 121 打印到字符 y,而是打印一个特殊字符

慕工程0101907 2023-05-24 15:01:42
给定一个字符串,我必须找到字符串中每个字符的 ASCII。如果任何 ASCII 不是素数,则必须将其转换为最接近的素数 ASCII。如果两个素数 ASCII 与原始 ASCII 等距,则取较小的。在上述操作之后,我需要将生成的 ASCII 转换为字符串。但是我的代码的问题是它不能打印 y form ASCII 121请帮我找出错误;提前致谢    int T = s.nextInt();    int len;    byte lowerPrime, greaterPrime, temp;    String word;    byte[] b;    for (int i = 0; i < T; i++) {        len = s.nextInt();        s.nextLine();        word = s.nextLine();        b = word.getBytes(StandardCharsets.US_ASCII);        for (int k = 0; k < b.length; k++) {            temp = b[k];            if (!checkPrime(temp)) {                lowerPrime = findPrimeSmaller(temp);                greaterPrime = findPrimeGreater(temp);                if ((temp - lowerPrime) == (greaterPrime - temp)) {                    b[k] = lowerPrime;                } else if ((temp - lowerPrime) < (greaterPrime - temp)) {                    b[k] = lowerPrime;                } else if ((temp - lowerPrime) > (greaterPrime - temp)) {                    b[k] = greaterPrime;                }            }        }        System.out.println(new String(b, "UTF-8"));    }}private static boolean checkPrime(byte n) {    if (n == 1) {        return false;    }    byte i = 2;    while (i < (n / 2)) {        if (n % i == 0) {            return false;        }        i++;    }    return true;}private static byte findPrimeGreater(byte n) {    while (!checkPrime(n)) {        n++;    }    return n;}private static byte findPrimeSmaller(byte n) {    while (!checkPrime(n)) {        n--;    }    return n;}
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

您的代码按预期工作。

如您所见,它将在输入中找到127字符y( ),作为第一个更大的质数。但是,代码点为 127 的 ASCII 字符是不可打印的字符,这使得它看起来好像输出中没有字符。121

您可能希望[32,126]通过向findPrimeSmallerfindPrimeGreater方法添加一些检查来将代码限制在可打印的 ASCII 范围内,这样它们就不会超出此限制(当然,不要返回该限制,因为它不是质数,但是当它到达边界时返回Integer.MIN_VALUE和/或类似的东西,所以你知道它会在你的 if-checks 中选择另一个素数)。 或者如果你想在你的程序中使用非 ASCII unicode 字符,你可能想跳过不可打印的字符。Integer.MAX_VALUE

另外,一般说明:使用 IDE 调试器或添加打印行,就像我在上面的在线版本中所做的那样,有助于检查代码在哪里出错以及它做了什么。在这种情况下,您的代码完全可以正常工作,但生成的字符只是一个不可打印的字符(具有 unicode 值127)。

PS:这部分代码可以简化:

if ((temp - lowerPrime) == (greaterPrime - temp)) {

    b[k] = lowerPrime;

} else if ((temp - lowerPrime) < (greaterPrime - temp)) {

    b[k] = lowerPrime;

} else if ((temp - lowerPrime) > (greaterPrime - temp)) {

    b[k] = greaterPrime;

}

到:


if ((temp - lowerPrime) <= (greaterPrime - temp)) { // Single <=, instead of loose == and <

    b[k] = lowerPrime;

} else if ((temp - lowerPrime) > (greaterPrime - temp)) {

    b[k] = greaterPrime;

}


查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信