新手小白旷工的第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,常数项不是应该不输出吗?(希望有网友能指点一下)
看了之后我觉得自己的思路真的很乱。我最先的想法是简单的,但没有做出来。说到底就是没有认真研究题目给的测试样例。希望大家引以为戒。
好了这道题终于结束了。