zoukankan      html  css  js  c++  java
  • 中国大学MOOC数据结构基础习题集、022、一元多项式求导

    首先贴一下题目:

    设计函数求一元多项式的导数。

    输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过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的结果:

    
    
  • 相关阅读:
    C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用
    Protocol Buffers 语法指南
    ERP、SCM及电子商务关系分析
    ]进程注入是王道之为NhibernateProfiler增加“附加到进程”功能原理(源码)
    架构师职位与软件文档的思考
    OSGI:从面向接口编程来理解OSGI
    开源的.NET桌面程序自动更新组件 ——Sharp Updater 2.1发布
    C#开源文件实时监控工具Tail&TailUI
    SQL 存储过程入门(变量)
    Python入门笔记(2):基础(上)
  • 原文地址:https://www.cnblogs.com/clevercong/p/4171551.html
Copyright © 2011-2022 走看看