我有一个像1191223这样的整数 我想迭代数字。我不知道怎么用C做这个,有没有简单的方法呢?
感谢。
答案 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 );
}
}
}
我认为假设你有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改编成了一个更通用的版本。
答案 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 ++参考资料以查看代码是否仍与您的目的相关。