心得:
用stringstream来分割字符串给字符串变量的时候,遇到空格就会截断,然后跳过空格,继续给下一个字符串变量输入,直到字符流里为空
用stringstream给整形变量的时候,遇到一个非数字字符时截断,如果是空格就跳过然后继续给下个整形变量输入,但是如果是其他字符就无法跳过,会一直停在那里,再给下一个整形变量赋值时会直接中断错误,从而ss>>int返回0(可作为条件判断)
在vector容器里用迭代器访问结构体时,要用(*it).成员变量,来访问成员(原本以为直接it.成员变量访问,结构体不是基本类型,其内容存在堆中,如果是基本变量,直接*it取得栈里面的值,而引用类型先(*it)取得对象的地址,然后通过"."来访问成员
题目:
设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0
。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
思路:
核心做法就是把输入的系数和指数进行处理,系数改为原系数乘以原指数,指数改为原指数减一,然后把系数不为0的数输出就行了
但是如何逐个获取各个数的系数和指数并存储是关键
获取的话既然用空格隔开,可以用stringstream字符串流来分割
存储的话就用一个结构体来存分割后的数字
还有题目最后那个"零多项式"输出0 0,其实就是如果系数和指数都是零(而不单单是系数为零),那么
就输出0 0
代码:
#include<iostream>
#include<sstream>
#include<vector>
using namespace std;
struct deri{
int coe,expo;//coe系数,expo指数
};
int main()
{
string str;
vector<deri> vec,res;
deri temp;
getline(cin,str);
stringstream ss;
ss<<str;
while(ss>>temp.coe>>temp.expo)//字符流输入时遇到空格截断,然后跳过空格,继续给下个变量输入
vec.push_back(temp);//当字符流为空时,就会返回0,跳出循环
for(vector<deri>::iterator it=vec.begin();it!=vec.end();it++)
{
(*it).coe*=(*it).expo;
(*it).expo-=1;
if((*it).coe!=0)
res.push_back((*it));//将符合的结构体存到res中
if((*it).coe==0&&(*it).expo==0)
res.push_back((*it));
}
if(res.size()==0)
cout<<"0 0";//如果没有符合的结构体的话就直接输出个0 0
else
{
for(vector<deri>::iterator it=res.begin();it!=res.end();it++)
{
cout<<(*it).coe<<" ";
cout<<(*it).expo;
if(it!=res.end()-1)
cout<<" ";
}
}
return 0;
}