【机试刷题】牛客OJ在线编程常见输入输出练习

练习链接:https://www.nowcoder.com/exam/test/76850250/detail?pid=27976983&examPageSource=Search

 

题目:A+B(4)

输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。
示例:
输入例子:
4 1 2 3 4
5 1 2 3 4 5
0
输出例子:
10
15

我的代码:

int main() {
    int n =0;
    int temp = 0;
    int sum = 0;
    while(cin >> n )
    {
        if(n == 0) break;
        sum = 0;
        for(int i=0; i<n; i++)
        {
            cin >> temp;    sum += temp;
        }
        cout << sum <<endl;
    }
}

或者while((cin >> n)  && n!=0)

题目:A+B(6)

输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

 我的代码:

int main() {
    int n = 0;
    int temp = 0;
    while(cin >> n)
    {
        int sum  = 0;
        for(int i=0; i<n; i++)
        {
            cin >> temp;
            sum += temp;
        }
        cout << sum <<endl;
    }
}

 

 

题目:A+B(7) 学会使用<sstream> 和 getline()

输入描述:

输入数据有多组, 每行表示一组输入数据。

每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述:
每组数据输出求和的结果
示例
输入例子:
1 2 3
4 5
0 0 0 0 0
输出例子:
6
9
0

我的代码:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    string linestr;
    while(getline(cin, linestr))
    {
        stringstream lstream(linestr);
        int temp = 0;
        int sum = 0;
        while(lstream >> temp)
        {
            sum += temp;
        }
        cout << sum << endl;
    }
}

题目:字符串排序(3): 学会使用 getline() 的分隔符

输入描述:
多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100
输出描述:
对于每组用例输出一行排序后的字符串,用','隔开,无结尾空格
输出描述:
对于每组用例输出一行排序后的字符串,用','隔开,无结尾空格
示例1
输入例子:
a,c,bb
f,dddd
nowcoder
输出例子:
a,bb,c
dddd,f
nowcoder

我的代码:

//#include <iostream>
#include <bits/stdc++.h>
using namespace std;   

//具体解法:
//1. 每行单独进行排序
//2. 每行中,用“,”作为分隔符
int main() {
    string linestr;
    while(getline(cin, linestr))
    {
        //cout << "linestr == " << linestr <<endl;
        stringstream ss(linestr);
        string tempstr;
        vector<string> tempstrvec;

        while(getline(ss, tempstr, ','))
        {
            tempstrvec.push_back(tempstr);
            //cout << "now vec in:" << tempstr <<endl;
        }

        sort(tempstrvec.begin(), tempstrvec.end());
        #if 0  //使用下标的方法(不推荐)
        //不推荐原因:倒序必须使用int类型,size_t 为无符号类型,没有负数。(size_t i=m; i>=0; i--)会死循环
        //cout <<"strvec's size = "<<tempstrvec.size() <<endl;
        for(int i=0; i<tempstrvec.size(); i++)
        {
            if(i!=tempstrvec.size()-1)
            {
                cout << tempstrvec[i] << "," <<flush;
            }
            else
            {
                cout << tempstrvec[i];
            }
        }
        #endif
        #if 0 //使用for变体的变法(推荐)
        for(string str : tempstrvec)
        {
            cout << str <<" ";
        }
        #endif
        #if 1 //使用迭代器的办法(推荐)
        for(auto iter = tempstrvec.begin(); iter!=tempstrvec.end(); iter++)
        {
            cout << *iter;
            if(iter != tempstrvec.end()-1)
            {
                cout << ",";
            }
        }
        #endif
        cout << endl;
    }
}
// 64 位输出请用 printf("%lld")

扩展:EOF 是什么?

EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

经常用在C语言当中:(C++中需要包含 cstdio 才能使用)

int ch;
while((ch=getchar())!=EOF)//注意不能是while(ch=getchar()),两者不同
{
    putchar(ch);
}

在 windows 里面,按键Ctrl+Z 相当于输入 eof。

 

扩展:C++万能头文件 bits/stdc++.h 的用法和优缺点 包含哪些文件头

C++ 中使用 <bits/stdc++.h> 的利与弊
C++ 中的 <bits/stdc++.h> 是一个非常特殊的头文件。使用这个头文件可以包括 C++ 标准库中几乎所有的头文件,使得编写代码变得快速而简单。然而,它也带来了一些缺点。接下来,我们将深入探讨其优缺点,并通过具体案例加以说明。

好处:

快速编程: 对于竞赛编程等场合,时间十分宝贵。使用 <bits/stdc++.h> 可以快速开始编程,无需考虑需要哪些特定的头文件。

案例: 在 ACM ICPC、Codeforces 或 LeetCode 的编程比赛中,速度很重要。在这样的场合,使用这个头文件能够加速编码过程。

避免头文件遗漏: 有时可能会忘记包括某些必要的头文件,导致编译错误。使用 <bits/stdc++.h> 可以避免这类问题。

案例: 想象一个场景,你使用了 std::set 和 std::map,但忘记包含对应的头文件,结果导致编译错误。如果使用 <bits/stdc++.h>,则不会有这个问题。

坏处:

编译时间增加: 因为它包含了所有的头文件,所以编译时间可能会增加,特别是对于大型项目。

案例: 对于一个大型的商业软件项目,使用这个头文件可能会导致编译时间从几分钟增加到十几分钟,这在实际开发中是不可接受的。

非标准: <bits/stdc++.h> 并不是 C++ 标准库的一部分。这意味着,依赖它的代码可能不会在所有的编译器或平台上正常工作。

案例: 如果你的代码在 GCC 上可以正常工作,但在尝试使用 Clang 或 MSVC 编译时,可能会因为这个非标准头文件而出错。

可能导致不必要的包含: 即使你的代码只使用了 <vector> 和 <string>,使用 <bits/stdc++.h> 也会包括所有其他的头文件,这可能会导致额外的编译时间和内存使用。

案例: 在一个资源受限的嵌入式系统上,不必要地包括所有的头文件可能会导致程序超出内存限制。

缺乏清晰性: 从代码中很难看出程序实际使用了哪些库功能,这可能会导致代码维护困难。

案例: 如果一个新的开发者加入项目,并尝试理解代码,他/她可能会发现很难判断代码依赖于哪些具体的库功能。

 

扩展: C++中的for循环变体

变体1:for( : )

 for (类型 变量 : 数组或容器)

 for (int var : nums)

其中nums是一个数组
这种方式可以用来遍历数组!

for (int var : vec)

其中vec是一个int类型的容器
这种方式可以用来遍历容器,但是不能改变容器中的值

 

变体2:for_each

注意:需包含头文件:#include < algorithm >

这种方式需要借助一个函数vecFunc(),遍历将数组中的每个值在函数中进行操作。

for_each(nums, nums + N, vecFunc);

当然,for_each也可以适用于容器,使用迭代器的方式遍历,并更改其中的值,当然也需要借助函数,跟上面类似。

for_each (vec.begin(), vec.end(), vecFunc);

 

 

扩展:C++类型unsigned long 简介

在C++中,unsigned long int是一种无符号整数类型,它可以存储大于等于0的整数。

unsigned long int类型的特点如下:

  • 存储范围:0到4294967295(2的32次方减1,大概是42亿)。
  • 占用空间:4个字节(32位)或8个字节(64位)。
  • 无符号类型:只能存储非负整数,不能存储负数。

如果是unsigned long 占用32位,那么它和 unsigned int 类型是等同的。即32位无符号数字,可以用于ip地址的表示。

posted @ 2023-12-27 15:56  FBshark  阅读(374)  评论(0编辑  收藏  举报