初学者 pat basic 练习十 一元多项式求导

题目:

设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−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;
}

心得:

用stringstream来分割字符串给字符串变量的时候,遇到空格就会截断,然后跳过空格,继续给下一个字符串变量输入,直到字符流里为空

用stringstream给整形变量的时候,遇到一个非数字字符时截断,如果是空格就跳过然后继续给下个整形变量输入,但是如果是其他字符就无法跳过,会一直停在那里,再给下一个整形变量赋值时会直接中断错误,从而ss>>int返回0(可作为条件判断)

字符流就算把流全部输出出去其内存也在,但是如果已经空了还要继续输出,不仅会产生输出中断错误返回0,其内存也没了

在vector容器里用迭代器访问结构体时,要用(*it).成员变量,来访问成员(原本以为直接it.成员变量访问,结构体不是基本类型,其内容存在堆中,如果是基本变量,直接*it取得栈里面的值,而引用类型先(*it)取得对象的地址,然后通过"."来访问成员

发布了24 篇原创文章 · 获赞 3 · 访问量 816

猜你喜欢

转载自blog.csdn.net/qq_40930559/article/details/104078834