1010 一元多项式求导

设计函数求一元多项式的导数。(注: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值