我的主要目标是获取一个由数字的位值组成的数组。 例如:如果用户输入是:35779 我想要这个数组:{3,5,7,7,9} (用户输入可能会发生变化,其范围可以从10到int的最大可能值。
(int counter是一个int,表示输入数字的位数值。例如:输入时为:38557:counter = 5)
ArrayList<Integer> obj = new ArrayList<Integer>();
for(int i = counter-1; i >= 0 ; --i){
int ten2pow = (int)Math.pow(10, i);
int x = input/ten2pow;
obj.add(x);
input = input - x*ten2pow;
}
执行此操作并尝试打印数组时,输出为空数组
编辑:更改for循环初始化和终止条件后,循环工作正常,我能够将Place值存储在ArrayList中
答案 0 :(得分:0)
我想猜出这个数字,如果需要从控制台读取,那么我就把这个部分留下来了。
假设我们的号码是:35779
,那么一个简单的方法来划分&#34;它,逐位数字可能是:
number
number
除以10 示例:
number
:3577 重复:
number
:357 所以,这可以这样做:
import java.util.ArrayList;
import java.util.List;
public class NumbersToArray {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
int number = 35779;
while (number > 0) {
list.add(0, number % 10);
number /= 10;
}
System.out.println(list);
}
}
打印哪些:
[3, 5, 7, 7, 9]
所以,没有必要得到number
答案 1 :(得分:0)
正如Sotirios Delimanolis在对该问题的评论中暗示的那样,这里的第一个问题是for循环条件是错误的。如果i <= 1
以大于i
的数字开头,1
将永远不会成立。此外,如果该陈述是真的(即i
是0
或小于0
),那么增量表达式(i--
)将一直运行直到它下溢到Integer.MAX_VALUE
。
Alnitak在评论中还提到,从最低位数开始会更好。这遵循div/mod algorithm for base conversion,这是更传统的。
用于基本转换的div / mod算法通过递归获取 a 模 b 来工作,其中, a 是最后一个模的结果操作(从源值开始)和 b 是转换为的基础。每次迭代都会从右边开始为结果数提供另一个数字。
例如,将1000转换为基数2:
1000 % 2 = 500, R 0 => ?? ???? ???0
500 % 2 = 250, R 0 => ?? ???? ??00
250 % 2 = 125, R 0 => ?? ???? ?000
125 % 2 = 62, R 1 => ?? ???? 1000
62 % 2 = 31, R 0 => ?? ???0 1000
31 % 2 = 15, R 1 => ?? ??10 1000
15 % 2 = 7, R 1 => ?? ?110 1000
7 % 2 = 3, R 1 => ?? 1110 1000
3 % 2 = 1, R 1 => ?1 1110 1000
1 % 2 = 0, R 1 => 11 1110 1000
您可以看到余数如何用于确定结果值。在这里使用此算法的代码如下所示:
ArrayList<Integer> numberList = new ArrayList<Integer>();
int iteratedValue = input;
do {
int currentDigit = iteratedValue % 10;
numberList.add(currentDigit);
iteratedValue /= 10;
} while (iteratedValue > 0);
Collections.reverse(numberList);
do...while
循环用于确保将第一个数字添加到列表中,即使它是0
。
可以使用deque或其他集合反向添加项目,作为最后反转列表的替代方案。