中国大学MOOC-数据结构基础习题集、02-2、一元多项式求导
首先贴一下题目:
设计函数求一元多项式的导数。
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
建议测试如下几个情况(按Ctrl+Z结束输入):
1. 不以0结尾的(注:不要养成用特殊字符为结束符的习惯,比如用-1,#,!之类的,具体请见下面的代码部分):
输入:3 4 -5 2 6 1
输出:12 3 -10 1 6 0
2. 以0 0结尾的:
输入:3 4 -5 2 6 1 0 0
输出:12 3 -10 1 0 0
3. 只有0 0的:
输入:0 0
输出:0 0
先说一下我的解题思路吧:
1. 首先要处理输入的数据,这里我仍然用的是C++中的容器(vector),容器存储的类型就是int。因为这里没有说明要输入多少个,只是说明指数递降。所以我们编程的时候要用while循环输入数据,测试的时候Ctrl+Z终止输入数据。此部分的代码如下:
1 int a, b; 2 vector<int> vec; 3 while(cin>>a>>b) 4 { 5 vec.push_back(a); 6 vec.push_back(b); 7 }
2. 然后是处理数据,这里我新建了一个vector,名为res,只需要一次循环遍历存放输入数据的容器vec即可。此部分的代码如下:
1 int len = vec.size(); 2 vector<int> res; 3 for(int i=0; i<len; i=i+2) 4 { 5 int a=vec[i]; 6 int b=vec[i+1]; 7 if(a!=0 && b!=0) 8 { 9 res.push_back(a*b); 10 res.push_back(b-1); 11 } 12 }
3. 最后是输出数据和处理特殊情况。注意题目中明确要求结尾不能有多余的空格。因此,在循环输出的时候,要判断i=len-1的情况。此部分的代码如下:
1 len = res.size(); 2 for(int i=0; i<len; i=i+1) 3 { 4 if(i!=len-1) 5 cout << res[i] << " "; 6 else 7 cout << res[i]; 8 } 9 if(len == 0) 10 cout << "0 0";
4. 完整的代码如下:
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int a, b; 9 vector<int> vec; 10 while(cin>>a>>b) 11 { 12 vec.push_back(a); 13 vec.push_back(b); 14 } 15 int len = vec.size(); 16 vector<int> res; 17 for(int i=0; i<len; i=i+2) 18 { 19 int a=vec[i]; 20 int b=vec[i+1]; 21 if(a!=0 && b!=0) 22 { 23 res.push_back(a*b); 24 res.push_back(b-1); 25 } 26 } 27 len = res.size(); 28 for(int i=0; i<len; i=i+1) 29 { 30 if(i!=len-1) 31 cout << res[i] << " "; 32 else 33 cout << res[i]; 34 } 35 if(len == 0) 36 cout << "0 0"; 37 return 0; 38 }
个人分析:
这道题还是比较简单的,如果你不会用容器vector的话,建议自己尝试使用一下。包括list,map,set都是C++常见的容器。vector使用的方法和数组差不多,插入的话用push_back(),读取元素的话直接用下标就可以了(当然如果会用迭代器就更好了)。而且不用考虑数组超界的问题。
按照惯例最后粘一下AC的结果: