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

在这里插入图片描述

思路:

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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_44926962/article/details/109958762