如何反转无符号长整数中的数字?

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);
}



https://godbolt.org/z/MQ7jjV