写在前面
- 主要记录一下ACM输入输出的写法;
一、输入数值
1. 给定N的定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/B;
- 代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int n;
cin >> n;
int a, b;
while(n > 0) {
cin >> a >> b;
printf("%d\n", a+b);
--n;
}
return 0;
}
2. 给定结束值的定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/C;
- 代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int a, b;
while(cin >> a >> b) {
if(a == 0 && b == 0) {
break;
}
printf("%d\n", a+b);
}
return 0;
}
3. 无给定N的定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/A;
- 代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int a, b;
while(cin >> a >> b) {
printf("%d\n", a+b);
}
return 0;
}
4. 行首给定个数且给定N的不定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/E;
- 代码:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
while(t > 0) {
int n;
cin >> n;
vector<int> arr(n);
int sum = 0;
for(int i=0;i<n;++i) {
cin >> arr[i];
sum += arr[i];
}
printf("%d\n", sum);
--t;
}
return 0;
}
5. 行首给定个数且给定结束值的不定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/D;
- 代码:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
int n;
while(cin >> n) {
if(n == 0) {
break;
}
vector<int> arr(n);
int sum = 0;
for(int i=0;i<n;++i) {
cin >> arr[i];
sum += arr[i];
}
printf("%d\n", sum);
}
return 0;
}
6. 行首给定个数但无给定N的不定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/F;
- 代码:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
int n;
while(cin >> n) {
vector<int> arr(n);
int sum = 0;
for(int i=0;i<n;++i) {
cin >> arr[i];
sum += arr[i];
}
printf("%d\n", sum);
}
return 0;
}
7. 行首无给定个数且无给定N的不定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/G;
-
思路:
- 用
cin.get() == '\n'
判断当前是否已经到行尾; cin >> var
在读到文件尾会返回false
,其余返回true
;
- 用
-
代码:
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
vector<int> arr;
int sum = 0;
int a;
while(cin >> a) {
arr.emplace_back(a);
sum += a;
if(cin.get() == '\n') {
printf("%d\n", sum);
sum = 0;
arr.clear();
}
}
return 0;
}
二、输入字符串
1. 给定N的多个字符串输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/H;
- 代码:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
vector<string> arr(n);
for(int i=0;i<n;++i)
{
cin >> arr[i];
}
sort(arr.begin(), arr.end());
for(int i=0;i<n-1;++i)
{
cout<<arr[i]<<' ';
}
cout << arr[n-1] << endl;
return 0;
}
2. 行首无给定个数且无给定N的不定长多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/I;
- 代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
vector<string> arr;
string s;
while(cin >> s)
{
arr.emplace_back(s);
if(cin.get() == '\n')
{
sort(arr.begin(),arr.end());
for(int i=0;i<arr.size()-1;++i)
{
cout << arr[i] << ' ';
}
cout << arr[arr.size()-1] << endl;
arr.clear();
}
}
return 0;
}
3. 行首无给定个数且非空格分隔的多行输入
- 题目:https://ac.nowcoder.com/acm/contest/5657/J;
-
思路:
-
整行读到一个长字符串后,再按分隔符用遍历字符串的方式分割字符串;
-
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string s;
vector<string> arr;
while(cin >> s)
{
int left = 0, right = 0;
while(right < s.length())
{
if(s[right] == ',')
{
arr.emplace_back(s.substr(left, right-left));
left = right + 1;
}
right++;
}
arr.emplace_back(s.substr(left, right-left));
sort(arr.begin(), arr.end());
for(int i=0;i<arr.size()-1;++i)
{
cout << arr[i] << ',';
}
cout << arr[arr.size()-1] << endl;
arr.clear();
}
return 0;
}
三、输入非十进制数值
1. 输入二进制数值
- 题目:
- 输入为
0/1
串;
-
思路:
-
可以直接使用
std::bitset
进行处理;- 本质上是一个数组,每一个元素仅占一个bit空间;
- 但大小必须在编译时就指定;
- 构造函数:
- 可以由
std::string
的0/1
串构造; - 可以由整数构造;
- 可以由
-
参考:
- C++ bitset 常用函数及运算符;
-
代码:
#include <iostream>
#include <stdio.h>
#include <bitset>
using namespace std;
int main()
{
bitset<10> bits;
// bitset<10> bits(50);
// bitset<10> bits("110010");
cin >> bits;
unsigned long a = bits.to_ulong();
unsigned long long b = bits.to_ullong();
string s = bits.to_string();
cout << bits << endl;
printf("%lu\n", a);
printf("%llu\n", b);
printf("%s\n", s.c_str());
return 0;
}
2. 输入八进制数值
- 题目:
-
思路:
-
八进制数值以
0
开头,格式为0...
; -
用
std::oct
输入输出;- 需要用
std::dec
改回十进制输入输出;
- 需要用
-
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a;
cin >> oct >> a;
printf("%d\n", a);
printf("%o\n", a);
return 0;
}
3. 输入十六进制数值
- 题目:
-
思路:
-
八进制数值以
0x
开头,格式为0x...
; -
用
std::hex
输入输出;- 需要用
std::dec
改回十进制输入输出;
- 需要用
-
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int a;
cin >> hex >> a;
printf("%d\n", a);
printf("%x\n", a);
return 0;
}