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改编成了一个更通用的版本.
在下文中,我假设您的意思是十进制数字(基数为 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)