C语言 如何反转无符号长整型中的数字?



我想反转一个数字,但这是一个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。请参阅此 C 数据类型列表。

正如@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("%llun", 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 = %sn", 
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);
}

https://godbolt.org/z/MQ7jjV

最新更新