【问题标题】:C - How to print calculated numbers that have 15 digits?C - 如何打印具有 15 位数字的计算数字?
【发布时间】:2018-02-21 14:25:02
【问题描述】:

我试图打印99,999 * 99,999 * 99,999 的结果,结果应该是999,970,000,299,999,但打印出来的是18446744072244127711。我尝试打印20000 * 20000 * 20000,结果几乎相同。你们能告诉我如何得到真正的结果吗?

#include <stdio.h>

int main()
{
    int num;

    printf("Insert number : ");
    scanf("%ld", &num);

    fflush(stdin);

    unsigned long long int total = num * num * num;
    printf("Result : %llu", total);

    getchar();
    return 0;
}

【问题讨论】:

  • scanf("%ld",&amp;num) 也是未定义的行为,因为 numint
  • 您似乎溢出了int 值。
  • 你们能告诉我如何得到真正的结果 - 使用计算器吗?还是纸笔?
  • scanf("%d",&num);

标签: c


【解决方案1】:

一种方法是:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main(void)
{
    uint64_t x = 99999;
    printf("%" PRIu64 "\n", x*x*x);
}

您也可以使用 unsigned longunsigned long long 类型执行此操作,但这些取决于您的 C 实现(您使用的编译器)。

您尝试的算术超出了您正在使用的int 类型的支持范围。编程时,重要的是要确保您所做的计算不会超出您使用的类型的范围。

此外,您必须注意 C 代码中的类型:

  • 使用scanf 时,将转换说明符与类型匹配。例如,在扫描十进制数字以查找int 对象时,您应该使用%d,而不是%ld%ld 代表long int

  • unsigned long long int total = num*num*num; 中,unsigned long long int 影响total 的类型。它不影响计算num*num*num 中使用的类型。在该表达式中,使用了num 的类型。要在计算中使用unsigned long long int,您必须将一个或所有操作数转换为unsigned long long int,如使用强制转换:(unsigned long long int) num * num * num

  • 通过将 99999 分配给我命名为 xuint64_t 对象,我确保使用 uint64_t 算术计算 x*x*x。 (uint64_t 是一个 64 位无符号整数。)另一种方法是使用 UINT64_C(99999) * UINT64_C(99999) * UINT64_C(99999)UINT64_C 是在 stdint.h 中定义的宏,其本质上意味着“将此常量视为具有 uint64_t 或更宽的类型(实际上是 uint_least64_t)。”这也可以用UINT64_C(99999) * 99999 * 99999 完成,因为C 会自动将窄类型整数操作数转换为宽类型整数操作数。也可以通过(uint64_t) 99999 * 99999 * 99999 完成。

  • PRIu64 是一个宏,它为uint64_t 提供正确的printf 转换说明符。它在inttypes.h中定义。

【讨论】:

  • 学究式地,UINT64_C 给出了 uint_least64_t 类型的文字,而不是 uint64_t
  • 不错的答案(一如既往)。但我会明确表示(unsigned long long int) num * num * num 只是在转换第一个系数。另外两个是隐式转换的。
【解决方案2】:

错误:

  • %ld 上的 int 调用未定义的行为。
  • fflush(stdin) 调用未定义的行为,因为标准输入是输入流。
  • num*num*num 是在具有 int 类型的操作数上执行的,因此如果您尝试 99999 * 99999 * 99999,则会出现溢出,因为这是一个大于 231-1 的数字(假设为 32 位 int )。

固定代码:

#include <stdio.h>

int main(void)
{
    int num;
    printf("Insert number : ");
    scanf("%d",&num); getchar();
    long long int total = (long long)num*num*num;
    printf("Result : %llu",total);
    getchar();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 2018-06-12
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多