C ++获取int中的每个数字

Posted

技术标签:

【中文标题】C ++获取int中的每个数字【英文标题】:C++ get each digit in int 【发布时间】:2011-01-06 12:48:36 【问题描述】:

我有一个整数:

int iNums = 12476;

现在我想从 iNums 中获取每个数字作为整数。比如:

foreach(iNum in iNums)
   printf("%i-", iNum);

所以输出将是:“1-2-4-7-6-”。 但我实际上需要每个数字作为 int 而不是 char。

感谢您的帮助。

【问题讨论】:

【参考方案1】:
void print_each_digit(int x)

    if(x >= 10)
       print_each_digit(x / 10);

    int digit = x % 10;

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

【讨论】:

+1:你在递归解决方案上击败了我。我会把我的留在这里,但你先到了。 请注意,此代码可能不会刷新 cout 流。将 &lt;&lt; '\n' 更改为 &lt;&lt; endl 以确保刷新 cout。 @Andreas don't use endl unless you need it. @Andreas 也请阅读Core Guidelines 有人能解释一下这段代码是如何工作的吗?递归总是让我感到困惑。【参考方案2】:

将其转换为字符串,然后遍历字符。对于转换,您可以使用std::ostringstream,例如:

int iNums = 12476;
std::ostringstream os;

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

顺便说一句,通常使用的术语(你称之为“数字”)是“数字” - 请使用它,因为它使您的帖子标题更容易理解:-)

【讨论】:

我把那个数字改成了数字。 +1:这是在 C++ 中解决此类问题的最通用/最灵活的方法:学习这一点,您将为许多其他小任务做好准备。一旦你有了digits,你可以遍历字符串打印每个你喜欢的数字。 打印没问题,但我需要数字作为 int 才能使用它们。 @Ilyssis,很公平,您在帖子中提到了这一点。我的错:-( 别担心,我应该取一个更好的帖子标题。【参考方案3】:

这是一个更通用但递归的解决方案,它产生一个数字向量:

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

由于位数相对较少,递归是有界的。

【讨论】:

您正在混合有符号和无符号数据类型。此外,您不必要地将算法限制为 32 位。对 num 的向量和数据类型使用 unsigned long long 可以解决这两个问题。 @BenKey - 当我写这个 C++11 时还没有出现,所以 long long 不是标准的一部分。不过,您对混合签名和未签名是正确的。【参考方案4】:

我不测试它只是写下我的想法。任何语法错误的借口

这里是online ideone demo

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

【讨论】:

这会以相反的顺序打印每个数字。 (-1) 因为你得到 7654321 而不是 1-2-3-4-5-7。 朋友们有点粗心。不要那么苛刻 我宁愿使用dequepush_front 并使用ostream_iterator 发送到cout。 @Benoit 感谢您的评论。是的,有很多方法可以解决这个问题,这是我首先想到的【参考方案5】:

你可以用这个函数来做:

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;
    

【讨论】:

【参考方案6】:

要在“pos”位置获取数字(从位置 1 开始作为最低有效位 (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 << " ";

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

【讨论】:

这是我需要的最简单的解决方案,谢谢【参考方案7】:

这是执行此操作的方法,但这样您会得到相反的顺序。

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;

【讨论】:

但是请注意,尽管您的解决方案确实非常“简单”,但它也会以 reverse 顺序生成数字的组成数字。这可能是不可取的。【参考方案8】:

从 D.Shawley 的答案中得出,可以进一步通过输出结果来完全回答:

void stream_digits(std::ostream& output, int num, const std::string& delimiter = "")

    if (num) 
        stream_digits(output, num/10, delimiter);
        output << static_cast<char>('0' + (num % 10)) << delimiter;
    


void splitDigits()

    int num = 12476;    
    stream_digits(std::cout, num, "-");    
    std::cout << std::endl;

【讨论】:

【参考方案9】:

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

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 转换为字符串的麻烦。

(to_string 可用于c++11)

【讨论】:

【参考方案10】:

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

我的目的是将数字渲染到屏幕上,因此是函数名称。

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);
        
    

【讨论】:

【参考方案11】:

基于@Abyx 的回答,但使用div,因此每个数字只进行 1 次除法。

#include <cstdlib>
#include <iostream>

void print_each_digit(int x)

    div_t q = div(x, 10);

    if (q.quot)
        print_each_digit(q.quot);

    std::cout << q.rem << '-';


int main()

    print_each_digit(12476);
    std::cout << std::endl;
    return 0;

输出:

1-2-4-7-6-

注意仅适用于非负整数。

【讨论】:

【参考方案12】:

我的解决方案:

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 << ' ';

【讨论】:

【参考方案13】:

我使用的答案是这个简单的函数:

int getDigit(int n, int position) 

    return (n%(int)pow(10, position) - (n % (int)pow(10, position-1))) / (int)pow(10, position-1);


希望有人觉得这有帮助!

【讨论】:

【参考方案14】:
int a;
cout << "Enter a number: ";
cin >> a;

while (a > 0) 
    cout << a % 10 << endl;
    a = a / 10;             

【讨论】:

请在您的答案/代码中添加mo解释,这将有助于更好地理解。【参考方案15】:
int iNums = 12345;
int iNumsSize = 5;
for (int i=iNumsSize-1; i>=0; i--) 
    int y = pow(10, i);
    int z = iNums/y;
    int x2 = iNums / (y * 10);
    printf("%d-",z - x2*10 );

【讨论】:

提前声明号码大小既繁琐又没必要 谢谢,这正是我所需要的,因为我有一个固定的数字大小。 或者,等一下,看看你是否得到了更好的答案。最快的不一定是最好的。 @AliEl-sayedAli 这太可怕了。使用浮点数 pow() 来计算 integer 本质上是不准确的。对于某些大整数,这很可能会给出错误的结果。

以上是关于C ++获取int中的每个数字的主要内容,如果未能解决你的问题,请参考以下文章

将数字从标准输入获取到 C 中的数组

C语言字符串中获取数字

C语言字符串中获取数字

C语言字符串中获取数字

C/C++中字符串与数字相互转换

从 int 获取单个数字以在 C/C++ 中进行基数排序的最佳方法