【问题标题】:How does std::cout format the output?std::cout 如何格式化输出?
【发布时间】:2021-01-31 06:20:33
【问题描述】:

std::cout 是如何工作的? 以下代码未通过 HackerEarth.com 上某个问题的某些测试用例:

double n,a,b;
while(t--){
    cin>>n>>a>>b;
    long long x = round(b*n*1.0/(a+b));
    cout<<((a*x*x) + b*(n-x)*(n-x))<<endl;
}

同时,以下一个通过了所有这些:

double n,a,b;
while(t--){
    cin>>n>>a>>b;
    long long x = round(b*n*1.0/(a+b));
    long long ans = (a*x*x) + b*(n-x)*(n-x);
    cout<<ans<<endl;
}

为什么当我将计算值存储在变量中时,只有测试用例通过? 如果直接打印到控制台,值会改变吗? 我是 C++ 的新手。

【问题讨论】:

  • 在第一种情况下,代码打印double,在第二种情况下,它打印通过将双精度截断为小于或等于它的最接近的整数而获得的long long。这两个值不一定相同,打印浮点和整数类型的默认格式也可能不同。
  • 你能提供一个输出不同的例子吗? (除了给我们一些具体的工作之外,您可能会发现具体案例表明第一个代码可以输出非整数......)
  • @JaMiT 测试用例是隐藏的,但是,我明白你的意思是在第一种情况下获得一个非整数作为输出,而当存储在一个 long long 变量中时,它会被截断。谢谢。
  • @AkarshModi “测试用例被隐藏了”——这不是一个可以接受的借口。程序员所期望的技能之一是设计测试用例的能力,而不是仅仅依靠其他人来做。当您被告知某些测试用例失败时,您应该做出的反应之一是尝试更多的测试用例,直到找到一个失败的测试用例。 (此时,您将能够通过一个具体示例来扩充您的问题。)
  • 感谢您的好建议!我一定会记住这一点的。

标签: c++ c++17


【解决方案1】:

cout(或任何std::ostream)“选择”的输出格式取决于输出的类型(具体而言,取决于该类型的operator&lt;&lt; 的实现)。

让我们看看在这两种情况下都有哪些类型在起作用。

在您的第一个示例中,您将输出 double,因为 abn 是双精度数。尽管xlong long,但表达式是双重到期implicit conversions

在第二个示例中,您输出的是long long,因为这是ans 的类型。请注意,您对 ans 的计算可能会被截断,因为它被计算为双精度数(出于上述原因)但存储在 long long 中。

在不知道您正在谈论的测试用例的详细信息的情况下,输出的一个区别是双精度数可能会以十进制表示法输出(例如 1.231.0),而 long long(或任何整数type) 将作为一个整数输出(注意:有一些方法可以改变这种行为,为了简单起见,我在这里省略了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2011-01-11
    • 2013-09-11
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多