我想反转一个数字,但这是一个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