如何将一个数字数组连接成一个数字

3

我将尝试将任意长度的整数数组连接成一个单独的数字,而不进行加法运算。例如,如果我有以下数组

[ 1, 7, 12, 16, 3, 8]

我希望有一个变量等于 17121638,而不是等于 47

我的任务是将字符串输入转换为整数,但不能使用 Interger.parseInt() 来处理整个输入。

这是我当前的尝试:

public static String toNum(String input) {
    String [] charArray = new String [input.length()];
    int [] parsedInput = new int [input.length()];
    for(int i; i < input.length(); i++){
        charArray[i] = input.substring(i);          
    }
    for(int c; c < charArray.length; c++){
        parsedInput[c] = Integer.parseInt(charArray[c]);            
    }

你是在将整数放入字符串时遇到问题,还是在不使用Integer.parseInt()方法解析字符串时遇到问题? - Kon
我可以很好地交换字符串和整数而无需解析,问题在于如何将数字连接起来而不实际相加。比如说,如果我想创建一个变量,将数字1、4和16连接起来,我希望该变量为1416,而不是21。如果这有任何意义的话。 - user2748943
9个回答

3

试试这个:

int[] nums = { 1, 7, 12, 16, 3, 8 };

StringBuilder strBigNum = new StringBuilder();
for (int n : nums)
    strBigNum.append(n);

long bigNum = 0;
long factor = 1;
for (int i = strBigNum.length()-1; i >= 0; i--) {
    bigNum += Character.digit(strBigNum.charAt(i), 10) * factor;
    factor *= 10;
}

现在bigNum变量包含值17121638;在这种情况下,使用字符串更容易处理。请注意,如果输入数组太大(或数字太大),结果值将无法适应long


  1. bigNum 是一个 longfactor 是一个 int,这意味着你的算法停止工作比它应该停止的要早得多。
  2. 每当我看到 += 被应用于 String时,尤其是在循环中,我总是感到很不舒服,因为这是一个 Schlemiel the Painter 问题,我认为 StringBuilder 更适合解决这个问题(因为它也实现了 CharSequence,因此也有一个 charAt 方法)。
- C. K. Young
@ChrisJester-Young 修复了 factor 的类型(这是一个错误)。在这里使用 StringBuilder ... 嗯,那是正确的做法,但对于一个玩具示例,我认为使用 += 更清晰。我猜 OP 只是在学习基础知识。 - Óscar López

1

这是Óscar López的解决方案的变体,不使用任何解析(正如问题所要求的):

public class BigNum {
    public static void main(String[] args) {
        int[] nums = {1, 7, 12, 16, 3, 8};
        System.out.println(concatNums(nums));
    }

    public static long concatNums(int[] nums) {
        long result = 0;
        long multiplier = 1;
        for (int i = nums.length; i > 0; --i) {
            int num = nums[i - 1];
            while (num != 0) {
                result += multiplier * (num % 10);
                num /= 10;
                multiplier *= 10;
            }
        }
        return result;
    }
}

如果数组包含0,这个就不能正确工作。如果这很重要,请告诉我,我会调整算法来适应它。

1
尝试思考最左侧数字的索引与其在最终目标数字中的10的幂的关系。例如:拥有一组数组[1, 2, 3, 4]应该生成整数1234。千位数1000的10的幂如何与数组的长度和1的索引相关联?我将此表述为问题,因为我感觉这是一个学校的家庭作业问题。

1
使用join方法将数字相加 - 这将给你一个字符串,然后通过Number函数将其转换为数字。 你可以简单地运行:
    var arr = [ 1, 7, 12, 16, 3, 8];
    var num = arr.join('');
    Number(num);

0
这是一个简单的实现。如果有错误请纠正(我是初学者)。
int concatArray(int[] array){
    int sum = 0;
    int len = array.length-1;

    for(int i=0; i<array.length;i++){
        sum += (Math.pow(10, len) * array[i]);
        len--;
    }

    return sum;
}

0

你可以使用 StringBuilder 来将 numbers (int[]) 中的每个 int num 进行追加。

 StringBuilder sb = new StringBuilder();
 for (int num : numbers) {
    sb.append(num);
 }

 return sb.toString();

那对 OP 没有帮助,因为完成后你要怎么处理 StringBuilder?记住你不能使用 parseInt 等函数。 - C. K. Young

0

一行解决方案

String str = Arrays.toString(a).replaceAll("\\D", "");

0

好的,这里有另一种方法。虽然这与另一个答案类似,但这个可以处理一些零。只是数学计算,没有使用Integer.parseInt:

public static int intsToInt(int[] input) {
    int total = 0;
    int multiplier = 1;

    for (int i=input.length-1; i > -1; i--) {
        if (input[i] == 0) {
            multiplier *= Math.pow(10, String.valueOf(input[i]).length());
        }

        else {
            total += input[i]*multiplier;
            multiplier *= Math.pow(10, String.valueOf(input[i]).length());
        }
    }

    return total;
}


public static void main(String[] args) {
    int[] ints = {1, 7, 12, 0, 16, 3, 8};
    out.println(digitsToInt(ints));
    out.println(intsToInt(ints));
}

0
首先,你想要返回一个 int 类型 -- 而不是 String!
其次 -- 从技术上讲 -- 你可以使用 Integer.valueOf(s); 这个方法会返回一个 Integer 对象,其值与 .parseInt() 方法返回的值完全相同... 不过我认为这样做可能会被视为“作弊”。
第三,我认为这将有助于你的进展:http://nadeausoftware.com/node/97 特别是标题为:

使用自定义代码从字符串中解析整数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接