1. 程式人生 > >PAT乙級B1010- 一元多項式求導 (25)(25 分)

PAT乙級B1010- 一元多項式求導 (25)(25 分)

設計函式求一元多項式的導數。(注: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

思路:

1.定義一個結構體儲存多項式。

struct node{
	int exp,coe;
	node(int coe=0,int exp=0):coe(coe),exp(exp){}
}Node;

注意:如果是自己宣告的建構函式(如上),一定要加上預設建構函式(int coe=0,int exp=0),否則系統會報錯如下。

struct node{
	int exp,coe;
	node(int coe,int exp):coe(coe),exp(exp){}
}Node;

這種情況編譯顯示:

2.用vector儲存多項式,因為輸入是按照指數遞減輸入的,所以輸出預設也是遞減,不用自己在排序。

3.資料的讀入使用while(scanf("%d",&coe)!=EOF)進行判斷。

4.定義一個布林型flag標記是否有資料輸出,如果沒有資料輸出,最後額外printf("0 0");

參考程式碼:

#include<cstdio>  
#include<vector>
using namespace std;
struct node{
	int exp,coe;
	node(int coe=0,int exp=0):coe(coe),exp(exp){}
}Node;
vector<node> st;
int main()
{
	int exp,coe;
	bool flag=false;
	while(scanf("%d",&coe)!=EOF)
	{
		scanf("%d",&exp);
		if(exp!=0)
			{
				st.push_back(node(coe*exp,exp-1));
				flag=true;
			}
	}
	for(int i=0;i<st.size();i++)
	{
		printf("%d %d",st[i].coe,st[i].exp);
		if(i<st.size()-1) printf(" ");
	}
	if(flag==false) printf("0 0\n");
	return 0;
}

優化:

思路:

1。直接使用兩個變數coe,exp進行輸入和輸出操作,不再單獨定義結構體儲存資料。

參考程式碼:

#include<cstdio>  
int main()
{
	int exp,coe;
	bool flag=false;
	scanf("%d%d",&coe,&exp);
	if(exp!=0) {
		printf("%d %d",coe*exp,exp-1);
		flag=true;
	}
	while(scanf("%d",&coe)!=EOF)
	{
		scanf("%d",&exp);
		if(exp!=0)
			{
				printf(" %d %d",coe*exp,exp-1);
				flag=true;
			}
	}
	if(flag==false) printf("0 0\n");
	return 0;
}

優化:

1.資料讀入與判斷方式,繼續精簡。

參考程式碼:

#include<cstdio>  
int main()
{
	int exp,coe;
	bool flag=false;
	while(scanf("%d %d",&coe,&exp)!=EOF)
	{
		if(exp!=0)
		{
			if(flag) printf(" ");
			printf("%d %d",coe*exp,exp-1);
			flag=true;
		}
	}
	if(flag==false) printf("0 0\n");
	return 0;
}