跳转到内容
我的个人主页
返回

机试输入输出总结

力扣和真实机试不一样的点在于力扣不用处理输入输出。这里记录一下常见的几种输入输出方法。

读有限个变量

// scanf
int a, b, c;
scanf("%d %d %d", &a, &b, &c);

// cin
int a, b, c;
cin >> a >> b >> c;

读数量不定个变量

// scanf
int x;
while(scanf("%d", &x) != EOF) {
    // 处理x
}

// cin
int x;
while(cin >> x) {
    // 处理x
}

读整行

// scanf
char line[1000];
fgets(line, 1000, stdin); // 结果包含换行符

// cin
string line;
getline(cin, line); // 结果不包含换行符

混用时的坑

// 用scanf/cin读完数字后,缓冲区残留换行符
// 紧接着读整行会读到空行!

int n;
scanf("%d", &n);   // 或者 cin >> n;
cin.ignore();      // 清除残留换行符
string line;
getline(cin, line); // 这样才能正确读到下一行

补充:大输入量加速

// 放在main开头,用cin时防止超时
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 注意:加了这句之后scanf和cin不能混用!

补充:stdin 和 cin 的本质

stdin:

cin:

两者的关系:

ios::sync_with_stdio(false);

之后可以提速,但代价是断开了同步,此后混用 scanfcin 会导致读取顺序混乱

输出

机试输出的本质是把数据结构遍历一遍,按题目格式print出来

基本输出

// printf
printf("%d\n", n);
printf("%d %d\n", a, b);

// cout
cout << n << "\n";
cout << a << " " << b << "\n";

输出数组/vector

vector<int> ans;

for(int i = 0; i < ans.size(); i++) {
    printf("%d", ans[i]);
    if(i < ans.size()-1) printf(" "); // 末尾不加空格
}
printf("\n");

输出二维vector

vector<vector<int>> ans;

for(int i = 0; i < ans.size(); i++) {
    for(int j = 0; j < ans[i].size(); j++) {
        printf("%d", ans[i][j]);
        if(j < ans[i].size()-1) printf(" ");
    }
    printf("\n"); // 每行换行
}

输出浮点数

double ans;
printf("%.2f\n", ans); // 保留两位小数

具体格式以题目要求为准,题目说几位小数就几位小数,注意末尾有没有多余空格,这些细节可能导致WA 😊

2026年3月31日
张骞



上一篇
浅谈Agentic RL
下一篇
算竞常用 C++ STL 用法