相关文章: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’。
计算a+b
输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。
输出描述: 输出a+b的结果
输入
1 5
10 20
输出
6
30
#include
using namespace std;
int main(){
int a , b;
while(cin>>a>>b){
cout << a+b << endl;
}
return 0;
}
计算a+b
输入描述: 输入第一行包括一个数据组数t(1 <= t <= 100),接下来每行包括两个正整数a,b(1 <= a, b <= 10^9)
输出描述: 输出a+b的结果
输入
2
1 5
10 20
输出
6
30
#include
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;
}
计算a+b
输入描述: 输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据有多组, 如果输入为0 0则结束输入
输出描述: 输出a+b的结果
输入
1 5
10 20
0 0
输出
6
30
#include
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;
}
计算一系列数的和
输入描述: 输入数据包括多组。每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。接下来n个正整数,即需要求和的每个正整数。
输出描述: 每组数据输出求和的结果
输入
4 1 2 3 4
5 1 2 3 4 5
0
输出
10
15
// 朴素做法
#include
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
#include
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;
}
计算一系列数的和
输入描述: 输入的第一行包括一个正整数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
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;
}
计算一系列数的和
输入描述: 输入数据有多组, 每行表示一组输入数据。每行的第一个整数为整数的个数n(1 <= n <= 100)。接下来n个正整数, 即需要求和的每个正整数。
输出描述: 每组数据输出求和的结果
输入
4 1 2 3 4
5 1 2 3 4 5
输出
10
15
#include
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;
}
计算一系列数的和
输入描述: 输入数据有多组, 每行表示一组输入数据。每行不定有n个整数,空格隔开。(1 <= n <= 100)。
输出描述: 每组数据输出求和的结果
输入
1 2 3
4 5
0 0 0 0 0
输出
6
9
0
#include
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;
}
对输入的字符串进行排序后输出
输入描述: 输入有两行,第一行n第二行是n个空格隔开的字符串
输出描述: 输出一行排序后的字符串,空格隔开,无结尾空格
输入
5
c d a bb e
输出
a bb c d e
#include
#include
#include
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;
}
64bit IO Format: %lld
题目描述 : 对输入的字符串进行排序后输出
输入描述: 多个测试用例,每个测试用例一行。每行通过空格隔开,有n个字符,n<100
输出描述: 对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开
输入:
a c bb
f dddd
nowcoder
输出:
a bb c
dddd f
nowcoder
#include
#include
#include
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;
}
对输入的字符串进行排序后输出
输入描述: 多个测试用例,每个测试用例一行。每行通过,隔开,有n个字符,n<100
输出描述:对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格
输入
a,c,bb
f,dddd
nowcoder
输出
a,bb,c
dddd,f
nowcoder
// 常规利用下标分割输入string的方法
#include
#include
#include
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
#include
#include
#include
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;
}