设计函数求一元多项式的导数。(注:x^n
(n为整数)的一阶导数为n*x^n−1。)
输入格式:
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式:
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0。
输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
错误代码(第一遍写的,只过了样例……)
(只做参考,用来说明一些常见的错误和需要注意改进和优化的问题)
#include <stdio.h>
#include <string.h>
int main()
{
int n,a[99999],b[99999],c[99999],i=0,j,k,x=0,y=0;
scanf("%d",&n);
a[0]=n;
while(n!=0){
scanf("%d",&n);
a[++i]=n;
}
for(j=0;j<i;j++)
{
if(j%2==0)b[x++]=a[j];
else c[y++]=a[j];
}
for(k=0;k<i;k++){
a[k]=b[k]*c[k];
}
for(k=0;k<i;k++){
if(a[k]!=0&&c[k]-1!=0){
printf("%d ",a[k]);
printf("%d ",c[k]-1);
}
else if(a[k]!=0&&c[k]-1==0){
printf("%d 0 ",a[k]);
}
else if(c[k]-1==-1){
k+=1;
continue;
}
}
return 0;
}
标准答案:
#include <stdio.h>
int main(){
int x,y;
int tag = 0;
while(scanf("%d%d",&x,&y)!=EOF){//在黑框中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾“,因此需要用< Ctrl + Z >组合键,然后按< Enter >键的方式来告诉系统已经到了 EOF,这样系统才会结束 while
if(y!=0){
printf(tag==0?"%d %d":" %d %d",x*y,y-1);
tag = 1;
}
}
if(tag==0) printf("0 0\n");
return 0;
}
分析:自己的问题在于一次性地输入所有数据,然后再分奇偶讨论,奇数等于……,偶数等于……,这样极为繁琐。
换一种角度看问题,每次只输入两个数据,一输完这两个数据马上就输出其导数的系数和指数。
因为原题的输入没有对何时终止结束做要求,所以采用while(scanf()!=EOF 的形式。当用到while(scanf()!=EOF),代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,也可以在输入完成后按下 ,Ctrl+z,可以强行停止输入。
(注:1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
scanf(“%d%d”, &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0(若a未被读入,直接放弃b的读入)
如果遇到错误或遇到end of file或ctrl + z,返回值为EOF。)
更多请参见EOF的意义及用法(while(scanf(“%d”,&n) != EOF))
法二:
#include <stdio.h>
#include <stdbool.h>
int main() {
int a, n;
bool first = true;
while (scanf("%d%d", &a, &n) == 2) {
a *= n;
if (n) n--;
if (!first && a) putchar(' ');
//不是第一个且a不为 0
if (first || a) {
printf("%d %d", a, n);
first = false;
}
}
return 0;
}