如何将整数数字数组转换为整数值?
How to convert an array of integer digits into an integer value?
我有一个键盘,用于将数字输入微控制器 (atmega32 avr)。用户将能够输入 1、2 或 3 位数字,因为我定义了输入范围为 [0-999]。这些数字中的每一个都将存储在整数数组的位置中。
所以,如果我的数组定义为 int d[3]
并且用户依次输入 2、6、9,我将得到 d[0] == 2
、d[1] == 6
和 d[2] == 9
。现在我想从这些数字 {2, 6, 9}
: value == 269
中得到一个整数。我该怎么做?
以下答案应该适用于任何语言。这将相当简单,我建议您以稍微不同的方式格式化数组中的值。我认为如果操作员输入一个单位数字存储它会更容易:{0, 0, 5}
。如果它是一个两位数的数字,就这样存储:{0, 5, 9}
。最后,如果操作员输入一个三位数字,则按如下方式存储:{5, 9, 2}
.
最后,在格式化数组后,您可以使用以下逻辑来获取数字。例如,如果数组是 arr = {5, 9, 8};
那么您可以执行以下操作以将其作为数字获取:
arr[0] * 100 + arr[1] * 10 + arr[2]
如果您遵循我上面给出的格式设置建议,那将会有效。
您可以通过将数字乘以相应单位的幂来迭代创建数字。
例子:{2, 6, 9} 可以表示为 ((2 * 10^2) + (6 * 10^1) + (9 * 10^0))
#include <stdio.h>
#include <stdlib.h>
long power_10 (int exp)
{
long res = 1;
int i;
for (i = 1; i <= exp; i++) {
res = res * 10;
}
return res;
}
int main()
{
int arr[] = {2, 6, 9};
int i = 0;
int len = sizeof(arr)/sizeof(arr[0]);
long num = 0;
for (i = 0; i < len; i++) {
num += arr[i] * power_10((len - 1 - i));
}
printf("%ld\n", num);
}
你有两个问题要解决,对吧?
- 问题 #1:检测输入何时完成
- 问题 #2:将数字数组转换为单个整数值
我可以看到两种解决问题 #1 的方法:
- 用标记完成输入。 - 你的键盘有类似回车键的东西吗?
- 超时完成输入。 - 每次读取后启动计时器。溢出可以表示用户已完成输入。
在这两种情况下,您都可以计算出用户在 sentinel/timeout 之前通知了多少位数。
现在我们只需要解决问题 #2:
如果您将数字存储在从索引零开始的数组中,从最高有效数字到最低有效数字,那么解决方案将如下所示:
// note: n_digits and d come from the solution of the first problem
int sum = 0;
for (int i = 0; i < n_digits; ++i) {
sum = sum*10 + d[i];
}
// do whatever you need with the result
printf("%d\n", sum);
我有一个键盘,用于将数字输入微控制器 (atmega32 avr)。用户将能够输入 1、2 或 3 位数字,因为我定义了输入范围为 [0-999]。这些数字中的每一个都将存储在整数数组的位置中。
所以,如果我的数组定义为 int d[3]
并且用户依次输入 2、6、9,我将得到 d[0] == 2
、d[1] == 6
和 d[2] == 9
。现在我想从这些数字 {2, 6, 9}
: value == 269
中得到一个整数。我该怎么做?
以下答案应该适用于任何语言。这将相当简单,我建议您以稍微不同的方式格式化数组中的值。我认为如果操作员输入一个单位数字存储它会更容易:{0, 0, 5}
。如果它是一个两位数的数字,就这样存储:{0, 5, 9}
。最后,如果操作员输入一个三位数字,则按如下方式存储:{5, 9, 2}
.
最后,在格式化数组后,您可以使用以下逻辑来获取数字。例如,如果数组是 arr = {5, 9, 8};
那么您可以执行以下操作以将其作为数字获取:
arr[0] * 100 + arr[1] * 10 + arr[2]
如果您遵循我上面给出的格式设置建议,那将会有效。
您可以通过将数字乘以相应单位的幂来迭代创建数字。
例子:{2, 6, 9} 可以表示为 ((2 * 10^2) + (6 * 10^1) + (9 * 10^0))
#include <stdio.h>
#include <stdlib.h>
long power_10 (int exp)
{
long res = 1;
int i;
for (i = 1; i <= exp; i++) {
res = res * 10;
}
return res;
}
int main()
{
int arr[] = {2, 6, 9};
int i = 0;
int len = sizeof(arr)/sizeof(arr[0]);
long num = 0;
for (i = 0; i < len; i++) {
num += arr[i] * power_10((len - 1 - i));
}
printf("%ld\n", num);
}
你有两个问题要解决,对吧?
- 问题 #1:检测输入何时完成
- 问题 #2:将数字数组转换为单个整数值
我可以看到两种解决问题 #1 的方法:
- 用标记完成输入。 - 你的键盘有类似回车键的东西吗?
- 超时完成输入。 - 每次读取后启动计时器。溢出可以表示用户已完成输入。
在这两种情况下,您都可以计算出用户在 sentinel/timeout 之前通知了多少位数。
现在我们只需要解决问题 #2:
如果您将数字存储在从索引零开始的数组中,从最高有效数字到最低有效数字,那么解决方案将如下所示:
// note: n_digits and d come from the solution of the first problem
int sum = 0;
for (int i = 0; i < n_digits; ++i) {
sum = sum*10 + d[i];
}
// do whatever you need with the result
printf("%d\n", sum);