如何按顺序获取整数中的每个数字?

24
我有一个整数:
int iNums = 12476;

我想从中获取每个数字作为整数。就像这样:
foreach(iNum in iNums){
    printf("%i-", iNum);
}

所以输出将是:1-2-4-7-6-。但是我需要每个数字作为int而不是char。
17个回答

61
void print_each_digit(int x)
{
    if(x >= 10)
       print_each_digit(x / 10);

    int digit = x % 10;

    std::cout << digit << '\n';
}

2
+1:你比我先想到了递归解决方案。我还是把我的留在这里,但你先到了。 - D.Shawley
3
除非需要,否则请勿使用endl函数。 - Abyx
1
@Andreas,请阅读核心指南 - Abyx
@nrofis 在 if (x >= 10) 语句之前添加 x = abs(x); - milia
1
有人能解释一下这段代码是如何工作的吗?递归总是让我感到困惑。 - MitjaHD
显示剩余3条评论

29

将其转换为字符串,然后迭代每个字符。您可以使用std::ostringstream进行转换,例如:

int iNums = 12476;
std::ostringstream os;

os << iNums;
std::string digits = os.str();

顺便说一下,通常用于表示您所谓的“数字”的术语是“数字”,请使用它,因为它使您帖子的标题更加易懂 :-)


我把那个数字改成了数字。 - Ilyssis
+1:这是在C++中解决此类问题的最通用/灵活的方法:学会这个,你就可以为许多其他小任务做好准备。一旦你有了“digits”,你可以迭代字符串并以任何你喜欢的方式打印每个数字。 - Tony Delroy
可以打印,但我需要将数字作为整数来处理。 - Ilyssis
@Ilyssis,说得对,你在帖子中提到了这一点。是我的错 :-( - Péter Török
别担心,我应该取一个更好的帖子标题。 - Ilyssis
你能否将你的答案修改为类似于 int myInt = static_cast<int>(digits[i] - '0') 的形式呢? - Jens Bodal

11

以下是一个更加通用的递归解决方案,可生成数字向量:

void collect_digits(std::vector<int>& digits, unsigned long num) {
    if (num > 9) {
        collect_digits(digits, num / 10);
    }
    digits.push_back(num % 10);
}

因为数字相对较少,所以递归很容易受到限制。


你正在混合使用有符号和无符号数据类型。此外,你不必要地将算法限制在32位上。使用unsigned long long既可以解决向量的问题,也可以解决num数据类型的问题。 - Benilda Key
@BenKey - 当我写这个代码时,C++11还不存在,所以long long不是标准的一部分。但你关于混合使用有符号和无符号类型是正确的。 - D.Shawley

3

这是执行此操作的方法,但这样做会以相反的顺序返回结果。

int num;
short temp = 0;
cin>>num;

while(num!=0){
    temp = num%10;
    
    //here you will get its element one by one but in reverse order
    //you can perform your action here.
    
    num /= 10;
}

1
请注意,尽管您的解决方案确实非常“简单”,但它也以相反的顺序产生数字的组成部分。这可能是不可取的。 - Adrian Mole

2

我只是写下了脑海中的想法,没有测试过。不当之处请见谅。

这里有一个在线Ideone演示

vector <int> v; 

int i = ....
while(i != 0 ){
    cout << i%10 << " - "; // reverse order
    v.push_back(i%10); 
    i = i/10;
}

cout << endl;

for(int i=v.size()-1; i>=0; i--){
   cout << v[i] << " - "; // linear
}

3
这会按照相反的顺序打印每个数字。 - D.Shawley
返回翻译的文本:(-1) 因为你得到的是 7654321 而不是 1-2-3-4-5-7。 - Raphael Bossek
2
朋友们,稍微不小心一点就好了。不要太苛刻。 - user467871
我宁愿使用dequepush_front并使用ostream_iterator发送到cout。 - Benoit
@Benoit 感谢您的评论。是的,有很多方法可以解决这个问题,这是我首先想到的。 - user467871
使用堆栈而不是向量来避免逆序问题。 - Zac Howland

2

获取“pos”位置上的数字(从最低有效位(LSD)的第一个位置开始计算):

digit = (int)(number/pow(10,(pos-1))) % 10;

例子:number = 57820 --> pos = 4 --> digit = 7


逐个获取数字:

int num_digits = floor( log10(abs(number?number:1)) + 1 );
for(; num_digits; num_digits--, number/=10) {
    std::cout << number % 10 << " ";
}

示例:数字 = 57820 --> 输出:0 2 8 7 5

这是我需要的最简单的解决方案,谢谢。 - Omar
这有时会导致浮点精度问题(特别是使用--ffast-math)。最好在pow()周围添加round()。 - eclmist

1
你可以使用这个函数来完成:

void printDigits(int number) {
    if (number < 0) { // Handling negative number
        printf('-');
        number *= -1;
    }
    if (number == 0) { // Handling zero
        printf('0');
    }
    while (number > 0) { // Printing the number
        printf("%d-", number % 10);
        number /= 10;
    }
}

0

我不知道这是更快还是更慢或者毫无价值,但这是一个替代方案:

int iNums = 12476;
string numString;
stringstream ss;
ss << iNums;
numString = ss.str();
for (int i = 0; i < numString.length(); i++) {
    int myInt = static_cast<int>(numString[i] - '0'); // '0' = 48
    printf("%i-", myInt);
}

我指出这一点是因为iNums可能是用户输入,如果用户输入本来就是字符串,那么你就不需要费力将int转换为字符串了。
(在C++11中可以使用to_string)

0

我知道这是一个旧帖子,但所有这些答案都不可接受,所以我写了自己的代码!

我的目的是将数字呈现在屏幕上,因此函数名称如此命名。

void RenderNumber(int to_print)
{
    if (to_print < 0)
    {
        RenderMinusSign()
        RenderNumber(-to_print);
    }
    else
    {
        int digits = 1; // Assume if 0 is entered we want to print 0 (i.e. minimum of 1 digit)
        int max = 10;

        while (to_print >= max) // find how many digits the number is 
        {
            max *= 10;
            digits ++;
        }

        for (int i = 0; i < digits; i++) // loop through each digit
        {
            max /= 10;
            int num = to_print / max; // isolate first digit
            to_print -= num * max; // subtract first digit from number
            RenderDigit(num);
        }
    }
}

0

我的解决方案:

void getSumDigits(int n) {
    std::vector<int> int_to_vec;
    while(n>0)
    {
        int_to_vec.push_back(n%10);
        n=n/10;
    }

    int sum;

    for(int i=0;i<int_to_vec.size();i++)
    {
        sum+=int_to_vec.at(i);

    }
    std::cout << sum << ' ';
}

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