迭代C中的整数数字

kfo*_*rim 6 c

我有一个像1191223这样的整数,我想迭代数字.我不知道如何在C中做到这一点,有没有简单的方法来做到这一点?

谢谢.

BRP*_*ock 11

前进还是后退?

假设一个正整数:

  unsigned int n = 1191223;

  while (n != 0) {
       doSomething (n % 10);
       n /= 10;
  }
Run Code Online (Sandbox Code Playgroud)

...将从最小到最大,或......

编辑我忘记了我在这里的这个非工作解决方案.请注意,Very Smart People™似乎始终使用从最小到最大的迭代(printf例如,Linux内核和GLibC ,只是向后迭代)但是如果你真的不想使用snprintf某些东西,那么这是一种糟糕的方式原因…

int left_to_right (unsigned int n) {
  unsigned int digit = 0;

  if (0 == n) {
    doSomething (0);
  } else {
    digit = pow(10, 1.0+ floor(log10(n)));
    while (digit /= 10) {
      doSomething ( (n / digit) % 10 );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我认为假设你有log10,pow但不是snprintf,这是一个非常愚蠢的,所以另一个计划是

int left_to_right_fixed_max (unsigned int n) {
  unsigned int digit = 1000000000; /* make this very big */
  unsigned int n10 = 10 * n;

  if (0 == n) {
    doSomething (0);
  } else {
    while (digit > n10) { digit /= 10; }
    while (digit /= 10) {
      doSomething ( (n / digit) % 10 );
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

...或者,如果你真的没有硬件乘法/除法,你可以求助于使用10的幂表.

int left_to_right (unsigned int n) {
  static const unsigned int digit [] = 
    { 1,
      10,
      100,
      1000,
      10000,
      100000,
      1000000,
      10000000,
      100000000,
      1000000000 /* make this very big */
    };
  static const unsigned char max_place = 10;
  /* length of the above array */

  unsigned char decimal;
  unsigned char place;
  unsigned char significant = 0; /* boolean */

  if (0 == n) {
    doSomething (0);
  } else {
    place = max_place;
    while (place--) {
      decimal = 0;
      while (n >= digit[place]) {
        decimal++;
        n -= digit[place];
      }
      if (decimal | significant) {
        doSomething (decimal);
        significant |= decimal;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

...我已经从http://www.piclist.com/techref/language/ccpp/convertbase.htm改编成了一个更通用的版本.


moo*_*eep 5

在下文中,我假设您的意思是十进制数字(基数为 10)。也许您可以通过替换10s来使解决方案适应其他数字系统。

请注意,模运算对于负操作数来说是一件棘手的事情。因此,我选择了数据类型为无符号整数。

如果您想先处理最低有效位,您可以尝试以下未经测试的方法:

uint32_t n = 1191223;
do {
  uint32_t digit = n%10;
  // do something with digit
}
while (n/=10);
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢从最重要的数字开始遍历数字,您可以尝试修改以下未经测试的代码:

uint32_t n = 1191223;
#define MAX_DIGITS 10 // log10((double)UINT32_MAX)+1
uint32_t div = pow(10, MAX_DIGITS);

// skip the leading zero digits
while ( div && !(n/div) ) div/=10;
if ( !div ) div = 10; // allow n being zero

do {
  uint32_t digit = (n/div)%10;
  // do something with digit
}
while (div/=10);
Run Code Online (Sandbox Code Playgroud)