【问题标题】:Output is correct but SPOJ gave me wrong answer输出正确但 SPOJ 给了我错误的答案
【发布时间】:2020-10-07 10:12:57
【问题描述】:

快速提问。这是我为解决 SPOJ 中的问题而编写的代码。输出是正确的,但它给了我错误的答案。我的代码有什么问题?这是问题的链接:https://www.spoj.com/problems/SUMUP/

#include <iostream>
#include <iomanip>
using namespace std;
 
void cal(int n){
    long double a, b, c;
    a = (n*n) + n;
    b = 2.0 *(n*n + n + 1.0);
    c = a / b;
    cout<< setprecision(5) << c << '\n';
}
 
int main()
{   int n, z, t;
    scanf("%d", &t);
    const int NUMS = t;
    int bobo[NUMS];
 
    for(z = 0; z < NUMS; z++){
        scanf("%d", &bobo[n]);
        cal(bobo[n]);
    }
 
 
    return 0;
}

这是输入:

5
1
2
3
4
5

这是我的输出:

0.33333
0.42857
0.46154
0.47619
0.48387

【问题讨论】:

  • 请将问题复制为帖子中的文本,而不是通过链接。什么是北美?
  • 如果您认为bobo 不是可变长度数组:请注意它是,因为NUMS 的值在编译时是未知的。

标签: c++


【解决方案1】:

在行中:

for(z = 0; z < NUMS; z++){
    scanf("%d", &bobo[n]);
    cal(bobo[n]);
}

在调用scanf()cal() 时应使用z 而不是n

【讨论】:

  • 好眼光。 :) 不确定数组的用途,如果没有它,代码会很好,因为存储的值不会再次使用。
  • 你可以像这样scanf("%d", &amp;n);把号码保存到n,然后传给cal()
【解决方案2】:

SPOJ 预期输出似乎需要尾随零,如果有的话,setprecision(5) 函数将从 c 输出中删除。要保留尾随零,您可以在 cout 中添加 left &lt;&lt; setfill('0') &lt;&lt; setw(7) 以指示输出行中应至少包含 7 个字符(“0.”两个字符和 5 个小数位),如果有更少字符,它将用 '0' 填充到左侧,并添加回所需的尾随零。

cout << left << setfill('0') << setw(7) << setprecision(5) << c << '\n';

另一个更优雅的解决方案是改用printf

printf("%.5Lf\n",c);
void cal(int n){
    long double a, b, c;
    a = (n*n) + n;
    b = 2.0 *(n*n + n + 1.0);
    c = a / b;
    printf("%.5Lf\n",c);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多