1. 程式人生 > >[C/C++]OJ練習題:一元稀疏多項式計算器

[C/C++]OJ練習題:一元稀疏多項式計算器

>題目

   多組資料,第一行為N,表示有N組資料;接下來的N組資料,每三行為一組:第一行為n,m,t三個數字(int,下同),n為第一個多項式的項數、m為第二個多項式的項數、t為計算模式(為1時,第一個多項式減第二個多項式;為0時兩個多項式相加);第二行為2n個數字,為第一個多項式的係數和指數(冪次數),如3 3代表3*x^3;第三行為2m個數字,為第一個多項式。

    題目OJ資料保證所有的指數從小到大排列,且單個多項式項數不超過100;輸出時,要注意控制輸出格式。如對於資料:

4
2 2 1
1 1 1 2
1 1 1 2
6 2 0
1 0 1 1 1 2 1 3 1 4 1 5
-1 3 -1 4
0 4 0
0 0 1 1 -1 2 2 3
1 1 0
-1 1
0 0

    輸出為:

0

1+x+x^2+x^5

x-x^2+2x^3

-x

>分析

    這個題目麻煩的地方在於考慮輸出格式。比較訓練對函式模組的抽象能力,好的抽象可以保證不出現一大堆if語句套if語句。

    一個比較關鍵的點是,當兩個多項式的和/差為0時,應當輸出0,這是很多程式碼不被AC的原因。

>程式碼

#include <iostream>

#define addMode 0
#define subMode 1
#define maxSize 100

using namespace std;
// 完全沒輸出(相加相減/為0時) 
bool outputed = false;
int abs(int num){
	return num>0?num:-1*num;
}
// 根據計算模式計算係數 : 此題只有兩種模式——加或減 
int calculate(int a,int b,int mode){
	if(mode == addMode) return a+b;
	else return a-b;
}
// 輸出次冪 重點考慮1次冪時不輸出 "^冪",0次冪時不輸出"x"
void outputX(int x){
	if(x==1) cout<<"x";
	else if(x>1) cout<<"x^"<<x;
}
// 輸出係數 重點考慮係數為[+-1]時係數省略 (但次數不能為1),為-1時要顯示負號 
void outputA(int coefficient,int x){
	if(x==0 || abs(coefficient)!=1) cout << coefficient;
	if(coefficient == -1) cout<<"-";
}
// 輸出控制 重點考慮首項係數為正時不輸出 "+" 
void outputCtl(int coefficient, int x){
	if(coefficient==0) return;
	else if(coefficient > 0 && outputed){
		cout << "+" ;
	}
	outputA(coefficient,x);// 輸出係數 
	outputX(x);// 輸出指數 
	outputed = true;
}
// 表示式直譯器 
void expressInterpreter(){
	int n,m,t;
	cin>>n>>m>>t;
	
	// 直譯器開始運作時,沒有輸出任何字元 
	outputed = false;
	// 係數表 
	int a1[maxSize] = {0}, a2[maxSize] = {0};
	// 指數表 
	int x1[maxSize] = {0}, x2[maxSize] = {0};
	// 表頭指標 
	int top1=0,top2=0;
	
	for(int i=0;i<n;i++) cin>>a1[i]>>x1[i];
	for(int i=0;i<m;i++) cin>>a2[i]>>x2[i];
	
	// 掃描表 
	while(top1<n && top2<m){
		if(x1[top1] == x2[top2]){
			int coefficient = calculate(a1[top1],a2[top2],t);
			if(coefficient!=0) outputCtl(coefficient, x1[top1]);
			top1++;top2++;
		} else {
			if(x1[top1]<x2[top2]){
				outputCtl(a1[top1], x1[top1]);
				top1++;
			} else {
				outputCtl(a2[top2], x2[top2]);
				top2++;
			}
		}
	}
	
	// 清空殘留項 
	for(;top1<n;top1++)outputCtl(a1[top1], x1[top1]);
	for(;top2<m;top2++)outputCtl(a2[top2], x2[top2]);
	
	// 表示式為0時 直接輸出0 
	if(!outputed) cout<<0<<endl;
	else cout<<endl;
}

int main(){
	int N;
	cin >> N;
	for(int i=0;i<N;i++) expressInterpreter();
	return 0;
}


相關推薦

[C/C++]OJ練習題一元稀疏多項式計算器

>題目    多組資料,第一行為N,表示有N組資料;接下來的N組資料,每三行為一組:第一行為n,m,t三個數字(int,下同),n為第一個多項式的項數、m為第二個多項式的項數、t為計算模式(為1時,第一個多項式減第二個多項式;為0時兩個多項式相加);第二行為2n個數字

一元稀疏多項式計算器(加減)

題目:設Pn(x)和Qm(x)分別為兩個一元稀疏多項式,利用單鏈表儲存Pn(x)和Qm(x),簡單實現Pn(x)+Qm(x),Pn(x)-Qm(x),並就地逆置Pn(x)-Qm(x)。 思路:1.首先是建立連結串列,再儲存資料。         &nb

【資料結構】一元稀疏多項式計算器

基本功能 一元多項式的加減 一元多項式的乘法 一元多項式的導數 一元多項式的輸出為類數學表示式 執行截圖: 原始碼: #include<stdio.h> #include<stdlib.h> typedef struct {

資料結構課程設計一元稀疏多項式計算器

#include<stdio.h> #include<malloc.h> #include<iostream.h> typedef struct Polynomial {  float coef;            int exp; 

[C/C++]OJ練習題 壓縮字串&還原壓縮字串 [棧訓練]

>題目     給出一個定長的字串,進行壓縮或解壓。壓縮,給定一個最小需壓縮長度。如當最小需壓縮長度為3時,aaaabbc被壓縮成a4bbc。還原時,同樣以以上規則進行還原,如a5b3aba13b4被還原為aaaaabbbabaaaaaaaaaaaaabbbb。  

[C/C++]OJ練習題Z字形掃描(Zigzag Scan) 更好的解題思路

>題目     詳見我的上一篇文章,這裡就不再贅述了:     題目雖簡單,不過做起來還是蠻有意思的,比單純的演算法好玩。     30行完活,如果再精簡一下,把花括號啥的處理處理。壓縮到20行以內完全不成問題。 >更好的解法     今天草稿紙掉地上之後,

c++設計一個一元稀疏多項式簡單計算器

#include <iostream> using namespace std; struct Node { float coef; int expn; Node *next; }; void Copy(Node *&pc, Node *

C語言考試練習題_一元二次方程

#include <stdio.h> #include <stdlib.h> #include <math.h> int main() {     float a = 0, b = 0,c = 0;     fl

MFC實現一元稀疏多項式運算器

MFC實現一元稀疏多項式運算器 基本要求 輸入並建立兩個多項式 多項式a與b相加,建立和多項式c 多項式a與b相減,建立差多項式d 輸出多項式a, b, c, d。輸出格式:比如多項式a為:A(x)=c1xe1+ c2xe2+…+ cmxem,其中,ci和ei分別為第i項的係數和指數,且

一元稀疏多項式計算 (資料結構實驗)

#include <bits/stdc++.h> using namespace std; struct node{ float coef;//係數 int exp;//指數 node * next; }; node * creat(node * l)

資料結構 一元稀疏多項式 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和

一、實驗原理 利用鏈式儲存實現儲存一元多項式,並計算兩個一元多項式之和。一元多項式由係數和指數構成。 1、create()儲存係數指數:首先建立一個頭結點headLnode,從headLnode->next開始存入係數和指數,只有係數是0時,才表示這個多項式的結束,否

1010 一元多項式求導 ——C/C++實現

題目 1010 一元多項式求導 (25 point(s)) 設計函式求一元多項式的導數。(注:x​n​​(n為整數)的一階導數為nx​n−1​​。) 輸入格式: 以指數遞降方式輸入多項式非零項係數和指數(絕對值均為不超過 1000 的整數)。數字間以空格分隔。

資料結構篇連結串列多項式的加法與乘法。(C++)

連結串列多項式還算比較簡單的。 步驟分為 1.建立連結串列                  2.連結串列排序                  3.連結串列的自我化簡                   4.進行運算                  5.進行自我

C語言練習題一: 《C Primer Plus》第六章 C控制語句C迴圈——程式設計練習題 參考答案

1. 編寫一個程式,建立一個包含 26 個元素的陣列,並在其中儲存 26 個小寫字母。然後列印陣列的所有內容。#include<stdio.h> int main() { char alphabet[26]; int i = 0; char

C語言OJ專案參考(1044)矩陣對角線元素之和

1044:矩陣對角線元素之和 Description 求一個3×3矩陣對角線元素之和。 Input 矩陣 Output 主對角線 副對角線 元素和 Sample Input 1 2 3

C++ Builder 源碼TTS 文字轉語音,可以朗讀文字,或者把文字轉為 wav 聲音文件

源碼 img 操作 sde lan 語音 skill http sta TTSDemo / TVictorTTS: 兼容 C++ Builder 2010 ~ C++ Builder 10 (CX) 版本 ? 包括 Win32 和 Win64 兩個版本。兼容的操作系統:W

C++ Builder 源碼使用 LAV 解碼器的播放器

bsp filters mov 文件 nbsp 支持的格式 spl knowledge aac 這個程序理論上支持所有 LAV 解碼器 (LAVFilters/LAVSplitter) 支持的格式,支持 (不限於) 播放以下後綴的文件: ? 視頻 (*.mkv, *.ts

[深入學習C#]C#實現多線程的方式Task——任務

ren avr 利用 run 如何 創建 其中 continue rep 簡介   .NET 4包含新名稱空間System.Threading.Tasks,它 包含的類抽象出了線程功能。 在後臺使用ThreadPool。 任務表示應完成的某個單元的工作。 這個單元的工作可以

Python和C|C++的混編(二)利用Cython進行混編

cde uil 有時 當前 class def 將在 python 混編 還能夠使用Cython來實現混編 1 下載Cython。用python setup.py install進行安裝 2 一個實例 ① 創建helloworld文件夾創建hellowor

【2017-06-20】Linux應用開發工程師C/C++面試問題之一Linux多線程程序的同步問題

依次 其它 如果 開發工程師 logs 特殊 另一個 特殊情況 發生 參考之一:Linux 線程同步的三種方法 鏈接地址:http://www.cnblogs.com/eleclsc/p/5838790.html 簡要回答: Linux下線程同步最常用的三種方法就是互斥鎖、