Java 包含1000位的字符串,查找不带数组的最大5位数字

Java 包含1000位的字符串,查找不带数组的最大5位数字,java,string,numbers,digits,charat,Java,String,Numbers,Digits,Charat,我知道我的代码可以更简单、更高效。。。我的代码应该是最大的5位数。它可以工作,除了它只抓取3个数字,我需要修改什么来改变它 public class thousandDigits { public static void main(String[] args) { int greatest = 0; String num = ("73167176531330624919225119674426574742355349194934"

我知道我的代码可以更简单、更高效。。。我的代码应该是最大的5位数。它可以工作,除了它只抓取3个数字,我需要修改什么来改变它

public class thousandDigits {
    public static void main(String[] args) {
        int greatest = 0;
        String num = ("73167176531330624919225119674426574742355349194934"
                + "96983520312774506326239578318016984801869478851843"
                + "85861560789112949495459501737958331952853208805511"
                + "12540698747158523863050715693290963295227443043557"
                + "66896648950445244523161731856403098711121722383113"
                + "62229893423380308135336276614282806444486645238749"
                + "30358907296290491560440772390713810515859307960866"
                + "70172427121883998797908792274921901699720888093776"
                + "65727333001053367881220235421809751254540594752243"
                + "52584907711670556013604839586446706324415722155397"
                + "53697817977846174064955149290862569321978468622482"
                + "83972241375657056057490261407972968652414535100474"
                + "82166370484403199890008895243450658541227588666881"
                + "16427171479924442928230863465674813919123162824586"
                + "17866458359124566529476545682848912883142607690042"
                + "24219022671055626321111109370544217506941658960408"
                + "07198403850962455444362981230987879927244284909188"
                + "84580156166097919133875499200524063689912560717606"
                + "05886116467109405077541002256983155200055935729725"
                + "71636269561882670428252483600823257530420752963450");

        for (int n = 0; n < num.length() - 5; n++) {
            greatest = ((num.charAt(n)) + (num.charAt(n+1)) + (num.charAt(n+2)) + (num.charAt(n+3))
                    + (num.charAt(n+4)));
            if (greatest > n) {
                n = greatest;
            }
        }
        System.out.print(greatest);
    }
}

我想你会发现它不是三位数,而是六个字符的总和是一个三位数

如果您要查找最大的五位数,则需要提取五位数(而不是六位数),并为其分配权重。所以第一个数字必须乘以10000,第二个数字必须乘以1000,依此类推

但还有更多:您将在字符串中的索引处获取字符。这不是您想要的,因为它与该字符的数值不同。为此,您需要:

num.charAt(n) - '0'
这些更改应该允许您更正现有的算法

更有效的方法是提取5位子字符串并将其转换为整数。第一个是:

Integer.parseInt(num.subString(0, 5));
您可以迭代以使每个字符串都找到最大的字符串。

我认为您希望使用迭代所有可能的5个字符的子字符串,然后您可以使用更新
最大的子字符串。差不多

int greatest = Integer.MIN_VALUE;
for (int i = 0; i < num.length() - 4; i++) {
    // int value = Integer.parseInt(num.substring(i, i + 5));
    int value = Integer.parseInt(String.valueOf(num.charAt(i))
                + num.charAt(1 + i) + num.charAt(2 + i) + num.charAt(3 + i)
                + num.charAt(4 + i));
    greatest = Math.max(greatest, value);
}
System.out.println(greatest);
int max=Integer.MIN\u值;
对于(int i=0;i

我得到了
99890

虽然@ElliottFrisch和@dave提供了更优雅的答案,但我试图修改您的原始版本,以下是我的代码(我已经测试过):

公共类千位数{
公共静态void main(字符串[]args){
int=0;
字符串num=(“7316717653133062491922511974426574742355349194934”
+ "96983520312774506326239578318016984801869478851843"
+ "85861560789112949495459501737958331952853208805511"
+ "12540698747158523863050715693290963295227443043557"
+ "66896648950445244523161731856403098711121722383113"
+ "62229893423380308135336276614282806444486645238749"
+ "30358907296290491560440772390713810515859307960866"
+ "70172427121883998797908792274921901699720888093776"
+ "65727333001053367881220235421809751254540594752243"
+ "52584907711670556013604839586446706324415722155397"
+ "53697817977846174064955149290862569321978468622482"
+ "83972241375657056057490261407972968652414535100474"
+ "82166370484403199890008895243450658541227588666881"
+ "16427171479924442928230863465674813919123162824586"
+ "17866458359124566529476545682848912883142607690042"
+ "24219022671055626321111109370544217506941658960408"
+ "07198403850962455444362981230987879927244284909188"
+ "84580156166097919133875499200524063689912560717606"
+ "05886116467109405077541002256983155200055935729725"
+ "71636269561882670428252483600823257530420752963450");
int max=-1;
对于(int n=0;n
我认为您正在尝试添加5个连续字符以获得总和,并存储最高总和的起始索引

但您应该使用将(num.charAt(n))转换为数值,然后添加

greatest  = Character.getNumericValue((num.charAt(n)) + Character.getNumericValue((num.charAt(n+1)) + Character.getNumericValue((num.charAt(n+2)) + 
Character.getNumericValue((num.charAt(n+3)) + 
Character.getNumericValue((num.charAt(n+4));
您需要一个valiable来存储旧值以进行比较和索引

if(greatest > oldGreatest) {
    index = n;
} 
然后最后使用索引输出侧循环打印:

System.out.print((num.charAt(index)) + (num.charAt(index+1) + (num.charAt(index +2)) + (num.charAt(index +3)) + (num.charAt(index +)));

你的代码不起作用。有3位数字963大于357。我想你的意思是
num.charAt(n+1)
不是
(num.charAt(n)+1)
。另外,您需要将第一个数字乘以10^(6-n),其中n=1开始,对于每个数字n=1…5我不应该在这个程序中使用子字符串,我感谢您的帮助though@Frank编辑。下次请列出您的所有限制,以便更快地获得更好的帮助(您说的只是没有数组)。它是
子字符串
,它是
(0,n]
。(部分)子字符串从指定的
beginIndex
开始,并延伸到索引
endIndex-1
处的字符。为什么要将num.charAt乘以1000(前2个),然后乘以100(第3个),最后一个仅乘以10?@Frank,因为从你的问题中,我相信我们找到了最大的5位数字(例如,99890),而不是5位数字的总和(例如,9+9+8+9+0=35)。因此,我们需要将前9视为90000(这就是为什么将其乘以10000),第二个9视为9000,依此类推。这有意义吗?
if(greatest > oldGreatest) {
    index = n;
} 
System.out.print((num.charAt(index)) + (num.charAt(index+1) + (num.charAt(index +2)) + (num.charAt(index +3)) + (num.charAt(index +)));