1010一元多项式求导

新手小白旷工的第N天,终于重新拿起电脑做题。(菜鸡做题,大段都是错误思路,不喜远离!)

写博客记录做题过程。

题目:

设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为nxn−1。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

听上去是个很简单的题目,求导嘛,谁都会。但是它有25分欸。


第一次尝试:

思路:设置两个动态数组,区别多项式系数与指数。之后输出系数时,即输出两者之积,然后输出指数减一,若指数为0,只输出一个0。//这里因未理解题目,就开始错误了

于是初版代码产生了:

#include<iostream>
using namespace std;
int main(){
    int *s1=new int[100];
    int *s2=new int[100];
    int ch,i=0;
    for(;;i++){
        cin>>ch;
        if(ch=='\0')
            break;
        s1[i]=ch;//输入系数
        cin>>s2[i];//输入指数
    }//这个输入应该没有问题······吧?
    for(int j=0;j<i;j++){
        if(j>0)
            cout<<" ";
        if(s2[j]==0){//常数项
            cout<<"0";
        }
        else{//普通项
            cout<<s1[j]*s2[j]<<" "<<s2[j]-1;
        }
    }
    return 0;
}

结果是全错,显示段错误。可能是数组越界的原因,改正一下。将100改成了1000,但还是错误。

我自己没看出来哪里错了,看一下别人的代码,觉得自己可能有两个问题,一是输入,二是少考虑情况:1.当指数为1时没有考虑只要输出系数就可以,不需要输出指数为0。2.当指数系数都为0时输出两个0

我没看出来输入错在哪里,求大佬帮忙指点一下。


第二次尝试:

代码如下

#include<iostream>
using namespace std;
int main(){
    int *s1=new int[1000];
    int *s2=new int[1000];
    int i=0;
    while(cin>>s1[i]){
        cin>>s2[i];//输入指数
        i++;
    }//这个输入应该没有问题
    for(int j=0;j<i;j++){
        if(j>0)
            cout<<" ";
        if(s2[j]==0){
            cout<<"0";//指数为0
            if(s1[j]==0)
                cout<<" "<<"0";//零多项式
        }
        else if(s2[j]==1){
            cout<<s1[j];//指数为1,即常数项
        }
        else{
            cout<<s1[j]*s2[j]<<" "<<s2[j]-1;
        }
    }
    return 0;
}

测试用例是对的,但只是部分正确。

我在思考是不是对题目的意识有误解。正确的应该是:当指数为1时,系数不变直接输出,输出指数为0 。而当指数为0 时,除了系数也为0时输出两个0的情况下,并不输出它的导数值0。(从6 1 -2 0而输出结果是6 0,即只输出了6 1的导数6 0,而-2 0是常数没有输出)


第三次尝试

#include<iostream>
using namespace std;
int main(){
    int *s1=new int[1000];
    int *s2=new int[1000];
    int i=0;
    while(cin>>s1[i]){
        cin>>s2[i];//输入指数
        i++;
    }
    for(int j=0;j<i;j++){
        if(j>0)
            cout<<" ";
        if(s2[j]==0){
            if(s1[j]==0)//是否是零多项式
                cout<<"0"<<" "<<"0";
        }
        else if(s2[j]==1){//常数项
           cout<<s1[j]<<" "<<"0";
        }
        else{//普通项
            cout<<s1[j]*s2[j]<<" "<<s2[j]-1;
        }
    }
    return 0;
}

但是这里产生了一个新的问题,在最后一项为常数项,求导不做任何输出时,我的代码会依旧为它输出一个最先的空格,导致格式不正确,所以要改正一下。我的改正方法就是将指数为0的情况移到前面去,直接跳过输出空格的步骤。

改正如下:

#include<iostream>
using namespace std;
int main(){
    int *s1=new int[1000];
    int *s2=new int[1000];
    int i=0,count=0;
    while(cin>>s1[i]){
        cin>>s2[i];//输入指数
        i++;
    }
    for(int j=0;j<i;j++){
        if(s1[j]!=0&&s2[j]==0)//将常数项移到前面来,不做相应输出
            continue;
        if(j>0&&count==0)
            cout<<" ";
        if(s2[j]==0){//零多项式
            cout<<"0"<<" "<<"0";
        }
        else if(s2[j]==1){//常数项
           cout<<s1[j]<<" "<<"0";
        }
        else{//普通项
            cout<<s1[j]*s2[j]<<" "<<s2[j]-1;
        }
    }
    return 0;
}

然而还有第三个测试用例没对TAT。完全不知道自己问题在哪。


学习优秀者

看了其他人的代码:

点击链接

柳神的代码很nb。真的非常短小精悍,几个情况处理得明明白白,不像我全是用if条件句从头写到尾还错了一个。

#include<iostream>
using namespace std;
int main(){
    int a,b,flag=0;
    while(cin>>a>>b){
        if(b!=0){//普通多项式中,常数项不输出
            if(flag==1)
                cout<<" ";//输出空格要放到里面来,否则可能多输出空格
            cout<<a*b<<" "<<b-1;
            flag=1;
        }
    }
    if(flag==0) //只有常数项or零多项式
        cout<<"0 0";
    return 0;
}

这个博客主自己的代码用了很多知识,不过我觉得稍稍有点复杂。我对他常数项的理解有点奇怪,也就是测试用例2,常数项不是应该不输出吗?(希望有网友能指点一下)

看了之后我觉得自己的思路真的很乱。我最先的想法是简单的,但没有做出来。说到底就是没有认真研究题目给的测试样例。希望大家引以为戒。

好了这道题终于结束了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值