如何反转无符号长整数中的数字?
How can I reverse the digits in an unsigned long?
我想反转一个数字,但它是 unsigned long
。但是,我不熟悉 unsigned long
的品质。
这是代码:
#include <stdio.h>
int main(void)
{
unsigned long num, reversed = 0;
scanf_s("%lu", &num);
while(num > 0)
{
reversed *= 10;
reversed = reversed + num % 10;
num /= 10;
}
printf("%lu", reversed);
return 0;
}
例如,如果输入是888888888889
,输出是不同的。
我认为这是因为它确实接近,如果这个词是正确的话。
我也不确定 %lu
。
如何反转 unsigned long
的数字?
一个 unsigned long
可能不足以容纳数字 888888888889
。从 <limits.h>
检查 LONG_MAX
的值。为确保您可以保留该数字,您需要确保使用 64 位整数。 long long
被定义为至少 64 位大。然后,您还应该在调用 scanf()
和 printf()
时使用 %llu
而不是 %lu
。看到这个 list of C data types.
正如@G.Sliepen 在他们的回答中指出的那样,这是因为 888888888889
无法放入 unsigned long
。要解决此问题,请使用 unsigned long long
,保证至少保存 64 位数据:
unsigned long long num, reversed = 0; // unsigned long long
scanf_s("%llu", &num); // %llu
// ...
printf("%llu", reversed); // %llu
也许你还需要打印一个换行符来查看输出:
printf("%llu\n", reversed);
在这里你有版本反转任何基数的数字(显示功能实际上只显示到基数 16 但你可以很容易地修改它添加更多数字)
unsigned long long reverse(unsigned long long val, unsigned base)
{
unsigned long long result = 0;
while(val)
{
result *= base;
result += val % base;
val /= base;
}
return result;
}
char *strreverse(char *str);
char *llutoa(char *num, unsigned long long val, unsigned base);
int main()
{
unsigned long long number = 6786785648796575;
char s1[65], s2[65];
for(unsigned base = 2; base <= 16; base++)
{
printf("Base %02u Number = %s Reveresed = %s\n",
base, llutoa(s1, number, base), llutoa(s2, reverse(number, base), base));
}
}
char *strreverse(char *str)
{
char *end = str, *saved = str;
while(*end) end++; end--;
while(end > str)
{
int ch = *end;
*end-- = *str;
*str++ = ch;
}
return saved;
}
const char * const digits = "01234567890ABCDEF";
char *llutoa(char *num, unsigned long long val, unsigned base)
{
size_t pos = 0;
while(val)
{
num[pos++] = digits[val % base];
val /= base;
}
num[pos] = 0;
return strreverse(num);
}
我想反转一个数字,但它是 unsigned long
。但是,我不熟悉 unsigned long
的品质。
这是代码:
#include <stdio.h>
int main(void)
{
unsigned long num, reversed = 0;
scanf_s("%lu", &num);
while(num > 0)
{
reversed *= 10;
reversed = reversed + num % 10;
num /= 10;
}
printf("%lu", reversed);
return 0;
}
例如,如果输入是888888888889
,输出是不同的。
我认为这是因为它确实接近,如果这个词是正确的话。
我也不确定 %lu
。
如何反转 unsigned long
的数字?
一个 unsigned long
可能不足以容纳数字 888888888889
。从 <limits.h>
检查 LONG_MAX
的值。为确保您可以保留该数字,您需要确保使用 64 位整数。 long long
被定义为至少 64 位大。然后,您还应该在调用 scanf()
和 printf()
时使用 %llu
而不是 %lu
。看到这个 list of C data types.
正如@G.Sliepen 在他们的回答中指出的那样,这是因为 888888888889
无法放入 unsigned long
。要解决此问题,请使用 unsigned long long
,保证至少保存 64 位数据:
unsigned long long num, reversed = 0; // unsigned long long
scanf_s("%llu", &num); // %llu
// ...
printf("%llu", reversed); // %llu
也许你还需要打印一个换行符来查看输出:
printf("%llu\n", reversed);
在这里你有版本反转任何基数的数字(显示功能实际上只显示到基数 16 但你可以很容易地修改它添加更多数字)
unsigned long long reverse(unsigned long long val, unsigned base)
{
unsigned long long result = 0;
while(val)
{
result *= base;
result += val % base;
val /= base;
}
return result;
}
char *strreverse(char *str);
char *llutoa(char *num, unsigned long long val, unsigned base);
int main()
{
unsigned long long number = 6786785648796575;
char s1[65], s2[65];
for(unsigned base = 2; base <= 16; base++)
{
printf("Base %02u Number = %s Reveresed = %s\n",
base, llutoa(s1, number, base), llutoa(s2, reverse(number, base), base));
}
}
char *strreverse(char *str)
{
char *end = str, *saved = str;
while(*end) end++; end--;
while(end > str)
{
int ch = *end;
*end-- = *str;
*str++ = ch;
}
return saved;
}
const char * const digits = "01234567890ABCDEF";
char *llutoa(char *num, unsigned long long val, unsigned base)
{
size_t pos = 0;
while(val)
{
num[pos++] = digits[val % base];
val /= base;
}
num[pos] = 0;
return strreverse(num);
}