【模擬】FZU 2115 多項式積分

 

 Problem 2115 多項式積分

Accept: 149    Submit: 717
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 

 Problem Description

給定一個關於x(小寫字母)的多項式,求其關於x的一階積分,結果按降冪輸出,要求結果爲最簡多項式。輸出的多項式符合一般書寫規則,即有如下特性:

多項式由單項式相加或相減組成,單項式可以表示成ax^b的形式,其中a、b均爲整數,b爲大於等於0的整數,a不能爲0,特別的,當b等於1時,省略”^1”,寫做ax,當b等於0時,寫作a,而當a的值爲±1時,1必須省略。多項式首項的不允許有“+”。

 Input

輸入第一行爲數據組數T。

每組數據第一行是多項式項數n(1<=n<=10),

第二行n個數表示係數,係數均爲絕對值小於1000的整數,至少有1個係數不爲0。

第三行n個數表示對應係數下x的指數,數據保證指數兩兩不等,題中給定的指數均爲小於1000的非負整數。

 Output

輸出也只有一行,爲積分後的最簡多項式,係數如果是分數寫成最簡分數形式。

 Sample Input

2315 2 -22 1 0123

 Sample Output

5x^3+x^2-2x1/2x^4

 

 

注意輸出細節

 


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

struct node{
	int a[2],b;
}num[20];

int gcd(int a,int b){  
    return b?gcd(b,a%b):a;  
}  


bool cmp(node x,node y){
	return x.b>y.b;
}

int main(){
	int T;
	cin>>T;
	int n;
	int i,j;
	while(T--){
		cin>>n;
		
		for(i=0;i<n;++i){
			cin>>num[i].a[0];
		}
		for(i=0;i<n;++i){
			cin>>num[i].b;
			num[i].b++;
		}

		sort(num,num+n,cmp);
		int flag=1;
		for(i=0;i<n;++i){

			num[i].a[1]=num[i].b;

			if(num[i].a[0]==0)
				continue;
			if(num[i].a[0]>0){
				if(!flag)
					cout<<"+";
			}
			if(num[i].a[0]<0){
				cout<<"-";
				num[i].a[0]=-num[i].a[0];
			}
			
			
			int temp=gcd(num[i].a[0],num[i].a[1]);			
			num[i].a[0]=num[i].a[0]/temp;
			num[i].a[1]=num[i].a[1]/temp;
			if(num[i].a[0]>1||num[i].a[1]>1)
            {
                cout<<num[i].a[0];
			}
            if(num[i].a[1]>1){
					cout<<"/"<<num[i].a[1];
            }
			cout<<"x";
			if(num[i].b>1)
				cout<<"^"<<num[i].b;
			flag=0;
		}
		cout<<"\n";
	}
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章