PAT 乙级 1010
题目
题目地址:PAT 乙级 1010
思路
首先一个问题就是审题不清,导致代码返工了很多次,最后还没写对;
其次对于这道题来说每次输入一组数据之后就可以输出结果,太过机械地想要套用题目给出的输出样例,把简单的代码复杂化了;
最后注意“零多项式”的指数和系数都是0,但是表示为“0 0”这个问题。
代码
#include <iostream> using namespace std; int main() { int x = 0, y = 0; bool flag = false; while (cin >> x >> y) { if (x * y) { if (flag) cout << ' '; else flag = true; cout << x * y << ' ' << y - 1; } } if (!flag) cout << "0 0"; return 0; }
这段代码思路的巧妙之处就在于使用了一个标记变量flag,有两点优势:1. 在代码构造过程中自然解决了题设中给出的输出格式的问题,将每一组输出之间的空格放在了”本次输出“之前,利用标记变量解决了第一组输出之前没有空格的问题;2. 无需其它的操作就可以解决零多项式输出的问题;
下面来简单分析一下这段代码的思路,设置标记变量初值为false,输入第一组数据,若两者的乘积非零,进入操作,否则等待下一次输入;
非零:对于第一组输入数据,因flag为false,则将flag置为true,输出第一组的结果;第二组输入,因flag为true,先输出一个空格,之后输出第二组的结果;第三组……
为零:当之前存在输出,当前数据是常数项的一组,不进入while中的if结构,又因为这是最后一组输入,因此跳出循环,又不满足输出”0 0“的条件,因此结束程序,输出完毕;
当输入本身就是零多项式,因为不满足while中的if条件,且这是唯一的输入,因此跳出循环,又因为flag仍然是初值false,所以满足输出”0 0“的条件,程序结束,输出完毕。
初版代码
#include <iostream> #include <vector> using namespace std; int main() { vector<int> num; while (true) { int tmp = 0; cin >> tmp; num.push_back(tmp); if (getchar() == '\n') break; } num.pop_back(); int tmp = num[num.size() - 1]; if (tmp == 0) cout << 0 << ' ' << 0; else { num.pop_back(); vector<int>::iterator it; for (it = num.begin(); it != num.end();) { if (*it == 0) { it = num.erase(it); it = num.erase(it); } else ++it; } bool flag = true; for (int i = 0; i < num.size(); i++) { if (flag) { cout << num[i] * num[i + 1]; flag = false; } else { cout << num[i] - 1; flag = true; } if (i != num.size() - 1) cout << ' '; } cout << endl; } return 0; }
这段代码在测试中并未通过,但因为是初版代码,所以贴在这里供以后参考。