C++新手必看:PTA基础题7-10的三种解法,从if-else到格式化输出全搞定
第一次接触PTA平台的C++题目时,很多同学会被看似简单的算术题难住。就拿这道"算术入门之加减乘除"来说,虽然题目要求只是输出两个数的四则运算结果,但其中暗藏了不少值得玩味的编程技巧。今天我们就用三种不同风格的解法,带你从最基础的if-else开始,逐步掌握条件运算符和格式化输出的精髓。
1. 基础版:if-else分支实现
对于刚学完基本语法的C++新手来说,if-else是最直观的选择。让我们先看这个最易理解的版本:
#include <iostream> #include <iomanip> using namespace std; int main() { int a, b; cin >> a >> b; // 加法 cout << a << " + " << b << " = " << a + b << endl; // 减法 cout << a << " - " << b << " = " << a - b << endl; // 乘法 cout << a << " * " << b << " = " << a * b << endl; // 除法处理 if (a % b == 0) { cout << a << " / " << b << " = " << a / b << endl; } else { cout << a << " / " << b << " = " << fixed << setprecision(2) << (double)a / b << endl; } return 0; }这个版本有几个关键点需要注意:
- 整数除法陷阱:直接使用
a/b会丢失小数部分,必须先将其中一个数转为double类型 - 格式化输出:使用
fixed和setprecision(2)确保输出两位小数 - 空格处理:严格按照题目要求的格式输出,每个运算符前后都有空格
提示:在PTA系统中,输出格式必须与题目要求完全一致,包括空格和换行符,否则会被判为错误。
2. 进阶版:三目运算符简化逻辑
当你熟悉了基础语法后,可以尝试用条件运算符(三目运算符)来简化代码:
#include <iostream> #include <iomanip> using namespace std; int main() { int a, b; cin >> a >> b; cout << a << " + " << b << " = " << a + b << endl << a << " - " << b << " = " << a - b << endl << a << " * " << b << " = " << a * b << endl << a << " / " << b << " = " << (a % b == 0 ? to_string(a / b) : (stringstream() << fixed << setprecision(2) << (double)a / b).str()) << endl; return 0; }这个版本的特点:
- 代码更紧凑:使用链式
cout输出,减少重复代码 - 三目运算符:用
? :替代if-else,但要注意类型转换 - 字符串流技巧:在条件运算符中实现格式化输出需要一些小技巧
不过这种写法也有缺点:可读性稍差,调试起来不如if-else直观。建议在简单逻辑中使用三目运算符,复杂逻辑还是用if-else更清晰。
3. 优雅版:函数封装与格式化控制
为了写出更健壮、更易维护的代码,我们可以把功能拆分成函数:
#include <iostream> #include <iomanip> #include <string> using namespace std; string formatDivision(int a, int b) { if (b == 0) return "NaN"; // 虽然题目保证b不为0,但实际编程中应该处理 if (a % b == 0) { return to_string(a / b); } else { ostringstream oss; oss << fixed << setprecision(2) << (double)a / b; return oss.str(); } } void printOperations(int a, int b) { const string ops[] = {" + ", " - ", " * ", " / "}; const int results[] = {a + b, a - b, a * b}; for (int i = 0; i < 3; ++i) { cout << a << ops[i] << b << " = " << results[i] << endl; } cout << a << ops[3] << b << " = " << formatDivision(a, b) << endl; } int main() { int a, b; cin >> a >> b; printOperations(a, b); return 0; }这个版本的优点:
- 模块化设计:将除法格式化逻辑单独封装,提高代码复用性
- 可扩展性:如果需要增加新的运算,只需修改
printOperations函数 - 健壮性:虽然题目保证b不为0,但实际编程中应该处理除零异常
4. 常见问题与调试技巧
在实际编写和提交过程中,同学们常会遇到这些问题:
格式错误:PTA对输出格式要求严格,常见错误包括:
- 缺少空格(如"6+3=9"应为"6 + 3 = 9")
- 小数位数不对(如输出1.3而不是1.33)
- 多余的换行或缺少换行
整数除法陷阱:
// 错误写法 cout << a << " / " << b << " = " << a / b << endl; // 会丢失小数部分 // 正确写法 cout << fixed << setprecision(2) << (double)a / b << endl;边界条件测试:
- a=0时的输出
- a和b相等时的减法结果
- 大数相乘(接近100的数)是否溢出
调试技巧:在本地测试时,可以创建一个test()函数自动验证多种输入情况:
void test() { int testCases[][2] = {{6,3}, {8,6}, {0,5}, {99,100}, {100,99}}; for (auto &tc : testCases) { printOperations(tc[0], tc[1]); cout << "---" << endl; } }
5. 性能优化与代码风格
虽然这道题的数据规模很小,不需要考虑性能问题,但养成好的编码习惯很重要:
- 避免重复计算:像
a+b这样的简单运算可以直接内联,但复杂表达式应该先计算结果再输出 - 常量使用:字符串常量如" + "应该定义为常量,避免魔法字符串
- 错误处理:虽然题目保证输入有效,但实际项目中应该验证输入
- 代码格式化:保持一致的缩进和空格风格,提高可读性
最后分享一个我调试PTA题目的小技巧:当遇到"答案错误"但不确定哪里出错时,可以先用样例输入测试,然后逐步添加边界条件测试,同时仔细检查输出格式的每个细节。有时候一个多余的空格就会导致整个测试用例失败。