[C/C++]OJ練習題:一元稀疏多項式計算器
>題目
多組資料,第一行為N,表示有N組資料;接下來的N組資料,每三行為一組:第一行為n,m,t三個數字(int,下同),n為第一個多項式的項數、m為第二個多項式的項數、t為計算模式(為1時,第一個多項式減第二個多項式;為0時兩個多項式相加);第二行為2n個數字,為第一個多項式的係數和指數(冪次數),如3 3代表3*x^3;第三行為2m個數字,為第一個多項式。
題目OJ資料保證所有的指數從小到大排列,且單個多項式項數不超過100;輸出時,要注意控制輸出格式。如對於資料:
42 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)) 設計函式求一元多項式的導數。(注:xn(n為整數)的一階導數為nxn−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下線程同步最常用的三種方法就是互斥鎖、