迭代C中的整数数字

时间:2011-12-29 18:33:36

标签: c

我有一个像1191223这样的整数 我想迭代数字。我不知道怎么用C做这个,有没有简单的方法呢?

感谢。

9 个答案:

答案 0 :(得分:9)

前进还是后退?

假设一个正整数:

  unsigned int n = 1191223;

  while (n != 0) {
       doSomething (n % 10);
       n /= 10;
  }

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

编辑我忘记了我在这里的这个非工作解决方案。请注意,Very Smart People™似乎始终使用从最小到最大的迭代(例如,Linux内核和GLibC的printf,只是向后迭代)但如果你真的不这样做,这是一个糟糕的方法想出于某种原因使用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 );
    }
  }
}

我认为假设你有log10pow但不是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 );
    }
  }
}

...或者,如果你真的没有硬件乘法/除法,你可以求助于使用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;
      }
    }
  }
}

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

答案 1 :(得分:4)

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

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

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

uint32_t n = 1191223;
do {
  uint32_t digit = n%10;
  // do something with digit
}
while (n/=10);

如果您希望浏览从最高位开始的数字,您可以尝试调整以下未经测试的代码:

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

答案 2 :(得分:3)

你想迭代基数为10的数字,但是整数没有阿拉伯符号和数字的概念。首先将其转换为字符串:

int i = 1191223;
char buffer[16];
char *j;
snprintf(buffer, 16, "%i", i);
for ( j = buffer; *j; ++j ) { /* digit is in *j - '0' */ }

答案 3 :(得分:2)

您可以使用sprintf()将其转换为char数组,然后像这样迭代(未经测试,只是为了让您入门):

int a = 1191223;
char arr[16];
int rc = sprintf(arr, "%d", a);

if (rc < 0) {
    // error
}

for (int i = 0; i < rc; i++) {
    printf("digit %d = %d\n", i, arr[i]);
}

答案 4 :(得分:1)

这样的事情:

char data[128];
int digits = 1191223;
sprintf(data, "%d", digits);
int length = strlen(data);
for(int i = 0; i < length; i++) {
   // iterate through each character representing a digit
}

请注意,如果您使用0100之类的八进制数字,则还需要将sprintf(data, "%d", digits);更改为sprintf(data, "%o", digits);

答案 5 :(得分:1)

void access_digits(int n)
{
        int digit;
        if (n < 0) n = -n;
        do {
                digit = n % 10;
                /* Here you can do whatever you
                   want to do with the digit */
        } while ((n/=10) > 0);
}

答案 6 :(得分:0)

一种hackish方式是将其转换为字符串(请参阅strtol),然后将其重新转换为数字。 你可以使用像character you want - '0'

这样的东西

答案 7 :(得分:0)

脱离我的头顶:“i%100000”,“i%100000”,...

递归解决方案可让您从“i%10”开始。

答案 8 :(得分:0)

出于我的目的,以下短代码可以解决问题。

具有整数变量 the_integer 和已初始化的整数变量 sum_of_digits 。 (第1行)您可以执行以下操作:

1)使用 std :: to_string(int)函数将整数变量转换为字符串类型的变量。

2)迭代结果字符串的字符。 对于(char&c:str :: to_string(the_integer))

3)要将字符转换回整数,请使用 c -'0'。对于此解决方案,请查看(Convert char to int in C and C++)中的讨论。

4)..并将它们加在一起: sum_of_digits + = c-'0'

*),然后可以打印变量:第3行和第4行。

int the_integer = 123456789; int sum_of_digits;

for (char& c: std::to_string(the_integer)) {sum_of_digits += c-'0';}

std::cout << "Integer: " << the_integer << std::endl;
std::cout << "Sum of Digits << sum_of_digits << std::endl;

请注意 std :: to_string()有一些注释,请查阅c ++参考资料以查看代码是否仍与您的目的相关。