迭代C中的整数数字
我有一个像1191223这样的整数,我想迭代数字。 我不知道如何在C中做到这一点,有没有简单的方法来做到这一点?
谢谢。
前进还是后退?
假设一个正整数:
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 ); } } }
我认为假设你有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 ); } } }
…或者,如果你真的没有硬件乘法/除法,你可以使用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改编成了一个更通用的版本。
在下面我假设你的意思是十进制数字(基数为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);
你想迭代基数为10的数字,但是整数没有阿拉伯符号和数字的概念。 首先将其转换为字符串:
int i = 1191223; char buffer[16]; char *j; snprintf(buffer, 16, "%i", i); for ( j = buffer; *j; ++j ) { /* digit is in *j - '0' */ }
您可以使用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]); }
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); }
像这样的东西:
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);
。
一种hackish方式是将其转换为字符串(请参阅strtol),然后将其重新转换为数字。 你可以使用character you want - '0'
脱离我的头脑:“i%100000”,“i%100000”,……
递归解决方案可以让你从“i%10”开始。