C++程序设计实践——杭电acm2072、2073、2074、2075、2076

本文记录了作者在杭电ACM练习中解决2072至2076题的过程,包括遇到的问题、解决方案及代码实现。通过分析错误、调整代码,最终成功解决问题。涉及知识点有C++的stringstream、getline、set的使用等。
摘要由CSDN通过智能技术生成

杭电acm练习题

Day03—— ProblemID=2072

这个写不来于是去搜了下别人的代码,看懂以后我又自己背着写了一次,然后提交。
参考链接:大佬2072代码
意料之外的 果不其然, 第一次提交WrongAnswer了:
2072
错误的代码:

#include <iostream>
#include <sstream>
#include <string>
#include <set>
using namespace std;
int main() {
   
    string word;
    string s;
    set<string>allWords;
    stringstream ss;
    while (getline(cin, s)) {
   
        if (s == "#")
            break;
        ss.str(s);
        while (ss >> word && word != "#") 
            allWords.insert(word);
        cout << allWords.size() << endl;
        allWords.clear();
    }
    return 0;
}

不知道是错在哪啊。
用大佬的代码试了一下是可以提交成功的,如下图:
大佬的2072
我估计问题就出在我写的对于word判断是否为#那里,所以我用大佬的代码运行试了以下输入:
大佬代码本地运行
也就是说,只有单独输入的#才看做程序结束,跟在单词后面的#不作为程序结束的标志。
我改了while那里的判断以后,又把clear提到前面,第二次提交,又是WrongAnswer。
2072第二次
于是我本地运行了一下我第二次提交的代码:
2072本地运行第二次
为什么别人的代码运行没问题呢?
2072clear提前面
经过多次尝试,我发现不是clear位置的问题,而是不能把stringstream ss(s);这句话拆成两句写,本来我是想把他拆成两句创建对象的放在while循环外面,就不用每次循环重新新建浪费时间和空间,在while循环里面只要给他赋值就行了,结果没想到这样会运行不成功。

但我是那么轻易就放弃的人吗?是的,我是。 当然不是。

所以我就试着在一次输出结束后再用stringstream调用一次clear函数,果不其然,运行成功了!如下图:
2072本地运行第三次
然后我再去官网提交代码,通过啦!哈哈哈哈哈哈哈~
2072Accepted
代码如下:

#include <iostream>
#include <sstream>
#include <string>
#include <set>
using namespace std;
int main() {
   
    string word;
    string s;
    stringstream ss;
    set<string>allWords;
    while (getline(cin, s)) {
   
        if (s == "#")
            break;
        allWords.clear();
        ss.str(s);
        while (ss >> word) 
            allWords.insert
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值