输入

二维数组

  1. for(int i=0;i<m;i++){
  2. for(int j=0;j<n;j++){
  3. cin>>matrix[i][j];
  4. }
  5. }

预先不输入数据的组数

  1. 1. while(cin>>a>>b){
  2. 2. cout<<a+b<<endl;
  3. 3. }

预先知道数据组数

  1. 1. cin>>n;
  2. 2. for(int i=0; i<n; i++){
  3. 3. int a,b;
  4. 4. cin>>a>>b;
  5. 5. cout<<a+b<<endl;
  6. 6. }

只有一组数据

  1. 1. cin>>a>>b;
  2. 2. cout<<a+b<<endl;

整行输入(cin.get,getline)

  1. int N;
  2. cin>>N;
  3. char c;
  4. cin.get(c); /* ignore '\n' */
  5. string str;
  6. while(getline(cin,str)){
  7. /* 处理每行的输入 */
  8. }

按空格分割字符串(stringstream)

  1. void split(string& str){
  2. vector<string> rec;
  3. string result;
  4. stringstream input(str);
  5. while(input>>result){
  6. rec.emplace_back(result);
  7. }
  8. }

输出

不需要输出case数

  1. 1. cin>>n;
  2. 2. for(int i=0; i<n; i++){
  3. 3. int a, b;
  4. 4. cin>>a>>b;
  5. 5. cout<<a+b<<endl;
  6. 6. }

需要输出case数

  1. 1. cin>>n;
  2. 2. for(int i=0; i<n; i++){
  3. 3. int a, b;
  4. 4. cin>>a>>b;
  5. 5. cout<<"Case"<<i+1<<a+b<<endl;
  6. 6. }

每个case之后有空行

  1. 1. for(int i=0; i<n; i++){
  2. 2. int a, b;
  3. 3. cin>>a>>b;
  4. 4. cout<<"Case"<<i+1<<a+b<<endl<<endl;
  5. 5. }

两个Case之间有空行

  1. 1. cin>>n;
  2. 2. for(int i=0; i<n; i++){
  3. 3. int a, b;
  4. 4. cin>>a>>b;
  5. 5. if(i>0){
  6. 6. cout<<endl;
  7. 7. }
  8. 8. cout<<"Case"<<i+1<<a+b<<endl;
  9. 9. }


处理细节和技巧

输入

不用保存所有组的输入,读一组算一组

“可恶”的字符串——带空白

  • scanf, cin之类都读到空白结束
  • gets, cin.getline。再自己parse
  • 用scanf, gets代替cin

输出

注意格式

  • 字母大小写
  • 什么时候换行
  • 输出“case”后面有没有“#”或者“:”之类。
  • 每行末尾有\n,但一般没有空白
  • 用printf代替cout。


    OJ常见状态

  • 内存超限——使用内存过多

  • 返回非零——main函数返回了非零值
  • 浮点错误——除以零
  • 运行错误——指针乱指
  • 段错误——指针越界