C++ : Online Judge 输入输出练习

C++ : Online Judge 输入输出练习

目录:

相关文章:OJ编程题教训
相关题目:牛客网OJ在线编程常见输入输出练习场


注意如何理解 while ( cin>>n ) : “读入不定多行”

cin 是标准输入流对象,即istream类的对象,其从标准输入缓冲区中读出数据;

而每次从键盘键入时,只有按下回车,输入的内容才会被送入输入缓冲区;

而 cin>>n 只是从缓冲区中读出一个数值(这个数值会被空格分隔);

每次读出一个,只要还能读出数据,while循环就能再执行一次;

故 while(cin>>n) 是一次输入多个值,然后回车打进缓冲区,

然后唤醒 while(cin>>n) 进行循环读出;

只要缓冲区没有数据,cin 的成员函数就会阻塞,等待数据的到来;

需要注意 cin 会自动忽略头部的空格,且不能在 cin 中读出空格;

cin.get() : 得到当前输入流中的一个字符(多用于退出循环和判断当前流已空);

使用如 if(cin.get()==’\n’) break;

getline() : 可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

函数原型:istream& getline ( istream &is , string &str , char delim ); 注意返回是 cin 对象!!;

istream &is 表示一个输入流,譬如cin;

string &str 表示把从输入流读入的字符串存放在这个字符串中;

char delim 表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为’\n’。


1、A+B(1)

计算a+b
输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。
输出描述: 输出a+b的结果

输入
1 5
10 20

输出
6
30

#include <iostream>
using namespace std;
int main(){
    int a , b;
    while(cin>>a>>b){
        cout << a+b << endl;
    }
    return 0;
}

2、A+B(2)

计算a+b
输入描述: 输入第一行包括一个数据组数t(1 <= t <= 100),接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)
输出描述: 输出a+b的结果

输入
2
1 5
10 20

输出
6
30

#include <iostream>
using namespace std;
int main(){
    int case_num;
    int a, b;
    cin >> case_num;
    for(int i=0; i<case_num; ++i){
        cin >> a >> b;
        cout << a+b << endl;
    }
    return 0;
}

3、A+B(3)

计算a+b
输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出描述: 输出a+b的结果

输入
1 5
10 20
0 0

输出
6
30

#include <iostream>
using namespace std;

int main(){
    int a, b;
    while(cin >> a >> b){
        if(a==0&&b==0) return 0;
        cout << a+b << endl;
    }
    return 0;
}

4、A+B(4)

计算一系列数的和
输入描述: 输入数据包括多组。每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。接下来n个正整数,即需要求和的每个正整数。
输出描述: 每组数据输出求和的结果

输入
4 1 2 3 4
5 1 2 3 4 5
0

输出
10
15

// 朴素做法
#include<iostream>
using namespace std;
int main(){
    int n,m;
    int sum;
    while(cin>>n){
        if(n==0) return 0;
        sum = 0;
        for(int i=0; i<n; ++i){
            cin >> m;
            sum += m;
        }
        cout << sum << endl;
    }
    return 0;
}
// OJ做题常用方式
#include<iostream>
#include <vector>
using namespace std;
int Count_Sum(vector<int>& v){
    int sum = 0;
    for(auto i : v){
        sum += i;
    }
    return sum;
}
int main(){
    vector<int> v;
    int n, m, sum;
    while(cin>>n){
        if(n==0) return 0;
        for(int i=0; i<n; ++i){
            cin >> m;
            v.push_back(m);
        }
        sum = Count_Sum(v);
        cout << sum << endl;
        v.clear();
    }
    return 0;
}

5、A+B(5)

计算一系列数的和
输入描述: 输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。接下来t行, 每行一组数据。每行的第一个整数为整数的个数n(1 <= n <= 100)。接下来n个正整数, 即需要求和的每个正整数。
输出描述: 每组数据输出求和的结果

输入
2
4 1 2 3 4
5 1 2 3 4 5

输出
10
15

#include<iostream>
using namespace std;
int main(){
    int n, m, val, sum;
    cin >> n;
    for(int i=0; i<n; ++i){
        cin >> m;
        sum = 0;
        for(int j=0; j<m; ++j){
            cin>>val;
            sum += val;
        }
        cout << sum << endl;
    }
    return 0;
}

6、A+B(6)

计算一系列数的和
输入描述: 输入数据有多组, 每行表示一组输入数据。每行的第一个整数为整数的个数n(1 <= n <= 100)。接下来n个正整数, 即需要求和的每个正整数。
输出描述: 每组数据输出求和的结果

输入
4 1 2 3 4
5 1 2 3 4 5

输出
10
15

#include <iostream>
using namespace std;
int main(){
    int n, val, sum;
    while(cin>>n){ // 读取出缓冲区第一个值时进入循环
        // 再次转到while语句时由于缓冲区无值,所以cin陷入阻塞;
        sum = 0;
        for(int i=0; i<n; ++i){ // 不断获取缓冲区后面的值
            cin>>val;
            sum += val;
        }
        cout << sum << endl;
    }
    return 0;
}

A+B(7)

计算一系列数的和
输入描述: 输入数据有多组, 每行表示一组输入数据。每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述: 每组数据输出求和的结果

输入
1 2 3
4 5
0 0 0 0 0

输出
6
9
0

#include <iostream>
using namespace std;
int main(){
    int val, sum = 0;
    while(cin>>val){
        sum += val;
        if(cin.get()=='\n'){ // 如果当前缓冲区已空,只剩换行符
            cout << sum << endl;
            sum = 0;
        }
    }
    return 0;
}

8、字符串排序(1)

对输入的字符串进行排序后输出
输入描述: 输入有两行,第一行n第二行是n个空格隔开的字符串
输出描述: 输出一行排序后的字符串,空格隔开,无结尾空格

输入
5
c d a bb e

输出
a bb c d e

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int n;
    string s;
    vector<string> v;
    cin>>n;
    while(cin>>s){
        v.push_back(s);
        if(cin.get()=='\n'){
            sort(v.begin(),v.end());
            for(int i=0; i<v.size()-1; ++i){
                cout << v[i] << " ";
            }
            cout << v[v.size()-1] << endl;
        }
    }
    return 0;
}

9、字符串排序(2)

64bit IO Format: %lld
题目描述 : 对输入的字符串进行排序后输出
输入描述: 多个测试用例,每个测试用例一行。每行通过空格隔开,有n个字符,n<100
输出描述: 对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

输入:
a c bb
f dddd
nowcoder

输出:
a bb c
dddd f
nowcoder

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    string s;
    vector<string> v;
    while(cin>>s){
        v.push_back(s);
        if(cin.get()=='\n'){
            sort(v.begin(),v.end());
            for(auto ss : v){
                cout << ss << " ";
            }cout << endl;
            v.clear();  // 一定要记得每过一行要清除容器!!
        }
    }
    return 0;
}

10、字符串排序(3)

对输入的字符串进行排序后输出
输入描述: 多个测试用例,每个测试用例一行。每行通过,隔开,有n个字符,n<100
输出描述:对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格

输入
a,c,bb
f,dddd
nowcoder

输出
a,bb,c
dddd,f
nowcoder

// 常规利用下标分割输入string的方法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    string s;
    vector<string> v;
    while(cin>>s){ // 每次读入一行
        for(int i=0, j=0; j<s.size(); ++j){ // 两个下标循环
            if(s[j]==','){ // 如果遇到','
                v.push_back(s.substr(i,j-i));
                i = j + 1;
            }
            if(j==s.size()-1){ // 或已经到了结尾
                v.push_back(s.substr(i,j-i+1));
            }
        }
        sort(v.begin(),v.end()); // 排序 
        for(int i=0; i<v.size()-1; ++i){ // 输入
            cout << v[i] << ',';
        }cout << v.back() << endl; // 最后一个string没有',’号
        v.clear(); // 记得清空容器
    }
    return 0;
}
// 利用 getline 和 stringstream 每次读入一整行的简单方法(也可以读入空格)
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
int main(){
    string str;
    string s;
    vector<string> v;
    stringstream ss; // 建立新的流
    while(cin>>str){ // 读入一行
        ss << str; // 将该行放入stringstream
        while(getline(ss, s, ',')){ // 按','分隔读取
            v.push_back(s);
        }
        sort(v.begin(),v.end());
        for(int i=0; i<v.size()-1; ++i){
            cout << v[i] << ',';
        }cout << v.back() << endl;
        v.clear(); // 容器清空
        ss.clear(); // 清空stringstream状态,但不会清空内存空间;
        ss.str(""); // 给stringstream赋新值,也是清空了内存;该句可有可无;
    }
    return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值