如何获取数字的数字而不将其转换为字符串/字符数组?

时间:2009-09-09 05:44:05

标签: c++

如何在不将数字转换为字符串或字符数组的情况下获取数字的数字?

15 个答案:

答案 0 :(得分:42)

以下按重要性递增的顺序打印数字(即单位,然后是数十等):

do {
    int digit = n % 10;
    putchar('0' + digit);
    n /= 10;
} while (n > 0);

答案 1 :(得分:19)

floor(log(number))+1怎么样?

使用 n 数字并使用base b ,您可以表达任何数字,最多pow(b,n)-1。因此,要获取基数 b 中数字 x 的位数,可以使用指数的反函数:base-b logarithm。要处理非整数结果,您可以使用floor()+1技巧。

PS:这适用于整数,而不适用于带小数的数字(在这种情况下,你应该知道你正在使用的类型的精度是多少)。

答案 2 :(得分:13)

因为每个人都在不知道问题的情况下闯入 这是我徒劳的尝试:

#include <iostream>

template<int D> int getDigit(int val)       {return getDigit<D-1>(val/10);}
template<>      int getDigit<1>(int val)    {return val % 10;}

int main()
{
    std::cout << getDigit<5>(1234567) << "\n";
}

答案 3 :(得分:11)

我已经看到很多答案,但是他们所有忘记使用do {...} while()循环,这实际上是解决此问题并正确处理0的规范方法。

我的解决方案基于this一个Naveen

int n = 0;
std::cin>>n;

std::deque<int> digits;
n = abs(n);
do {
    digits.push_front( n % 10);
    n /= 10;
} while (n>0);

答案 4 :(得分:8)

你想要这样的东西吗?

 int n = 0;
    std::cin>>n;

    std::deque<int> digits;
    if(n == 0)
    {
        digits.push_front(0);
        return 0;
    }

    n = abs(n);
    while(n > 0)
    {
        digits.push_front( n % 10);
        n = n /10;
    }
    return 0;

答案 5 :(得分:6)

这样的事情:

int* GetDigits(int num, int * array, int len) {
  for (int i = 0; i < len && num != 0; i++) {
    array[i] = num % 10;
    num /= 10;
  }
}

mod 10将为您提供数字。 div 10s将推进这个数字。

答案 6 :(得分:3)

整数版本很简单:

int fiGetDigit(const int n, const int k)
{//Get K-th Digit from a Number (zero-based index)
    switch(k)
    {
        case 0:return n%10;
        case 1:return n/10%10;
        case 2:return n/100%10;
        case 3:return n/1000%10;
        case 4:return n/10000%10;
        case 5:return n/100000%10;
        case 6:return n/1000000%10;
        case 7:return n/10000000%10;
        case 8:return n/100000000%10;
        case 9:return n/1000000000%10;
    }
    return 0;
}

答案 7 :(得分:3)

简单递归:

#include <iostream>

// 0-based index pos
int getDigit (const long number, int pos) 
{
    return (pos == 0) ? number % 10 : getDigit (number/10, --pos);
}

int main (void) {
    std::cout << getDigit (1234567, 4) << "\n";    
}

答案 8 :(得分:3)

这些解决方案都是递归的或迭代的。可能更直接的方法会更有效率吗?

左到右:

int getDigit(int from, int index)
{
   return (from / (int)pow(10, floor(log10(from)) - index)) % 10;
}

从右到左:

int getDigit(int from, int index)
{
   return (from / pow(10, index)) % 10;
}

答案 9 :(得分:1)

第一个数字(最不重要)= num%10,第二个数字= floor(num / 10)%10,3rd digit = floor(num / 100)%10。等

答案 10 :(得分:1)

一个简单的解决方案是使用数字的对数10。它返回数字的总位数-1。可以通过将数字转换为整数来固定。

int(log10(number)) + 1

答案 11 :(得分:0)

使用mod 10和div 10操作的序列(无论C ++中的语法如何)来分配 一次一个数字到其他变量。

在伪代码中

lsd = number mod 10
number = number div 10
next lsd = number mod 10
number = number div 10

等...

痛苦! ...但没有字符串或字符数组。

答案 12 :(得分:0)

不像马丁·约克的回答那么酷,但只解决一个任意的问题:

您可以使用递归打印大于零的正整数:

#include <stdio.h>
void print(int x)
{
    if (x>0) {
        print(x/10);
        putchar(x%10 + '0');
    }
}

这将在最后打印出最低有效数字。

答案 13 :(得分:0)

多年前,在回答上述问题时,我会写下面的代码:

int i2a_old(int n, char *s)
{
    char d,*e=s;//init begin pointer
    do{*e++='0'+n%10;}while(n/=10);//extract digits
    *e--=0;//set end of str_number
    int digits=e-s;//calc number of digits
    while(s<e)d=*s,*s++=*e,*e--=d;//reverse digits of the number
    return digits;//return number of digits
}

我认为函数printf(...)就是这样的。

现在我要写下这个:

int i2a_new(int n, char *s)
{
    int digits=n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
    char *e=&s[digits];//init end pointer
    *e=0;//set end of str_number
    do{*--e='0'+n%10;}while(n/=10);//extract digits
    return digits;//return number of digits
}

<强>优点:   查找表独立;   C,C ++,Java,JavaScript,PHP兼容;   获取位数min comparisons: 3;   获取位数max comparisons: 4;   快速代码;   比较非常简单快捷:cmp reg, immediate_data - &gt; 1个CPU时钟。

答案 14 :(得分:0)

将所有个别数字转换为数组 - 两种变体:

int i2array_BigEndian(int n, char a[11])
{//storing the most significant digit first
    int digits=//obtain the number of digits with 3 or 4 comparisons
    n<100000?n<100?n<10?1:2:n<1000?3:n<10000?4:5:n<10000000?n<1000000?6:7:n<100000000?8:n<1000000000?9:10;
    a+=digits;//init end pointer
    do{*--a=n%10;}while(n/=10);//extract digits
    return digits;//return number of digits
}

int i2array_LittleEndian(int n, char a[11])
{//storing the least significant digit first
    char *p=&a[0];//init running pointer
    do{*p++=n%10;}while(n/=10);//extract digits
    return p-a;//return number of digits
}