PAT 乙级 1010 一元多项式求导 (25分)---【数组技巧】

8 篇文章 0 订阅

在这里插入图片描述

思路:

1.开数组,范围是题目中的1000再多一点,用下标代表指数,其值代表系数;
2.while(…!=EOF),ctrl+z退出输出
3.从下标小到大去求导
4.记录系数不为0的次数
5.考虑特殊情况,次数为0,则直接输出“0 0”
6.不为0,输出系数与指数

注意点:

1.求导时,要从下标小的开始,因为如果从大的开始,下面的会用到其值(这里要使用原来的值,可此时已经改变了);所以从小的开始,下面不是会使用其值,而是改变其值,所以不影响。
求导后,要另原来的值系数为0,防止后续可能覆盖不成功!(虽然我不清楚为啥,因为已经初始化开辟的a数组为0了?)
2.根据系数不为0的次数,要另行判断,当次数为0时(即是一个零多项式),直接输出“0 0”
3.关于空格问题?
格式错误:if(i!=0) printf(" ");只保证最后一个(物理数组的)不输出空格,但是导致了中间的会多输出;
cnt--; if(cnt!=0) printf(" ");根据系数不为0的次数,来确定是否为最后一个(逻辑数组),是否输出。

代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
	 int a[1010]={};//存的是系数 
	 int e,n;//e是指数,n是系数 
	 while(scanf("%d%d",&n,&e)!=EOF){
	 	a[e]=n;//以指数e为下标 
	 }
	 
	 int cnt=0;
	 //求导:从小到大,先确定后面用不到的 
	 for(int i = 1; i <= 1000; i++){
	 	a[i-1] = a[i]*i;//原来的系数a[i]*原来的指数i
		a[i]=0;//(不能少)改变之后,要把之前的置为0,可能会防止不能覆盖 
		if(a[i-1]!=0){
			cnt++;//记录系数不为0的个数 
		}
	 }
	 //另行判断 
	 if(cnt==0){
	 	printf("0 0");
	 }
	 else{
	 	for(int i = 1000; i >=0; i--){
	 		if(a[i]!=0){	
				 printf("%d %d",a[i],i);
//				 if(i!=0)  格式错误:只防止了最后一个数没有多输出;会导致中间数多输出 
//	 				printf(" ");
				 cnt--;
				 if(cnt!=0) printf(" ");//只要不是最后一个,就都可以输出空格 
			 }
		 }
	 }
	 return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值