gpt4 book ai didi

c++ - acm问题。我的代码有什么问题?

转载 作者:行者123 更新时间:2023-11-28 01:04:16 24 4
gpt4 key购买 nike

题目内容:

输入:输入流包含一组整数 Ai (0 ≤ Ai ≤ 1018)。这些数字由任意数量的空格和换行符分隔。输入流的大小不超过 256 KB。

输出:对于从最后一个到第一个的每个数字 Ai,您应该输出其平方根。每个平方根应打印在单独的行中,小数点后至少四位数字。

示例
输入:

 1427  0   

876652098643267843 5276538

output:

2297.0716936297014.11640.000037.7757

Time Limit: 2.0 second
Memory Limit: 16 MB

C and C++ programs are compiled on the server by the 32-bit Microsoft Visual C++ 2010. Until August 3, 2010 Intel C++ Compiler 7.0 was used. You can download a free copy of Microsoft Visual Studio 2010 Express on this page. The compiler is invoked with the following parameters:

// Ccl /TC /MT /EHsc /O2 /W3 /Za /D "_CRT_SECURE_NO_WARNINGS"    /D "_CRT_SECURE_NO_DEPRECATE" /D "ONLINE_JUDGE"// C++cl /TP /MT /EHsc /O2 /W3 /Za /D "_CRT_SECURE_NO_WARNINGS"    /D "_CRT_SECURE_NO_DEPRECATE" /D "ONLINE_JUDGE"

This is my solution of this problem in gcc 4.3:

#include <iostream>
#include <list>
#include <string>
#include <sstream>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <stdio.h>

void sqrt_f(double n)
{
printf ( "%.4f\n", sqrt( static_cast<double>( n ) ) );
}

int main()
{
std::list<double> numbers;
std::string sInput;
getline( std::cin, sInput );
std::istringstream parse( sInput );
double tmp;
while ( parse >> tmp )
numbers.push_front( tmp );
std::for_each(numbers.begin(), numbers.end(), sqrt_f);
return 0;
}

但是判断结果是:错误答案(test1)

有什么问题?

最佳答案

警告:当我写这篇文章时,问题还在代码审查网站上,所以它主要是作为代码审查而写的。此处主要适用于 SO 的部分(修复输入问题)只是顺便提及。

目前,我假设您已经解决了@Jeff Mercado 指出的问题以获得如下代码:

#include <iostream>
#include <list>
#include <string>
#include <sstream>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <stdio.h>

void sqrt_f(double n)
{
printf ( "%.4f\n", sqrt( static_cast<double>( n ) ) );
}

int main()
{
std::list<double> numbers;
std::string sInput;
while (getline( std::cin, sInput )) { // added `while` to process all input
std::istringstream parse( sInput );
double tmp;
while ( parse >> tmp )
numbers.push_front( tmp );
}
std::for_each(numbers.begin(), numbers.end(), sqrt_f);
return 0;
}

然后,我将忽略您实际提出的问题(关于正确性),只审查(重写的)代码,假设它符合要求。

void sqrt_f(double n)
{
printf ( "%.4f\n", sqrt( static_cast<double>( n ) ) );
}

我在这里看到三件事我不是特别喜欢:

  1. 在 C++ 中使用 printf。 iostreams 通常是首选(尽管我们将看到,在这种情况下它们更冗长)。
  2. static_cast 似乎完全无关(n 已经是 double )。
  3. 关注点分离不佳。您正在将计算与 I/O 相结合。

    std::list<double> numbers;

我认为没有太多理由使用 std::list这里。您只在一端插入,然后从头到尾遍历。使用 std::list 的主要原因如果你要在列表中间的某个地方插入/删除。即使这样也不一定是最好的选择,但当你只需要在一端插入时,几乎可以肯定是错误的选择。

std::string sInput;
while (getline( std::cin, sInput )) { // added `while` to process all input
double tmp;
while ( parse >> tmp )
numbers.push_front( tmp );
}

我看不出有任何理由使用 std::getline这里。 getline主要在您的输入具有面向行的格式时有用,但这里它只是由任意数量的空白分隔的 double 流。为此,您似乎增加了额外的复杂性而没有获得太多功能作为返回。

我对循环 while (parse >> tmp) 也不太感兴趣.它肯定比某些替代品更好,但我宁愿使用 std::copy与(在这种情况下)一个 std::istream_iterator<double>将值复制到集合中。

我对您在这里使用集合的方式也不是特别兴奋。首先,您要使用 push_front 颠倒顺序.至少对我来说,如果您按原始顺序将数字添加到集合中,然后向后遍历集合,似乎会更容易理解。

    std::for_each(numbers.begin(), numbers.end(), sqrt_f);

...这就是 sqrt_f 中责任分离不佳的罪魁祸首.自从 STL 进入 C++ 以来已经有 15 年了,在那段时间里,我怀疑我是否见过多达 6 个 std::for_each 的良好用法。 .它可能很有用,但通常应该是您最后选择的算法,因为您找不到其他更好的算法。

我想如果我这样做,我会使用 std::vector用于存储(我们只需要在一端添加项目,这符合 vector 提供的内容)。我会使用 std::copy 将数据直接从 std::cin 复制到该 vector 中用std::istream_iterator<double> .然后我会使用 std::transform在 vector 上有一对反向迭代器,和一个 ostream_iterator为输出。由于固定标志和精度都是“粘性”的,我们可以通过在调用 std::transform 之前设置一次格式来获得正确格式的所有输出。 :

std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
std::cout.precision(4);

关于c++ - acm问题。我的代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7194707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com