參加過上個月月賽的同窗必定還記得其中的一個最簡單的題目,就是{A}+{B},那個題目求的是兩個集合的並集,今天咱們這個A-B求的是兩個集合的差,就是作集合的減法運算。(固然,你們都知道集合的定義,就是同一個集合中不會有兩個相同的元素,這裏仍是提醒你們一下)
呵呵,很簡單吧?Input每組輸入數據佔1行,每行數據的開始是2個整數n(0<=n<=100)和m(0<=m<=100),分別表示集合A和集合B的元素個數,而後緊跟着n+m個元素,前面n個元素屬於集合A,其他的屬於集合B. 每一個元素爲不超出int範圍的整數,元素之間有一個空格隔開.
若是n=0而且m=0表示輸入的結束,不作處理。Output針對每組數據輸出一行數據,表示A-B的結果,若是結果爲空集合,則輸出「NULL」,不然從小到大輸出結果,爲了簡化問題,每一個元素後面跟一個空格.
Sample Inputios3 3 1 2 3 1 4 7 3 7 2 5 8 2 3 4 5 6 7 8 0 0Sample Output算法
2 3 NULL
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 using namespace std; 5 6 int n, m; 7 int a[110], b[110]; 8 9 int main(){ 10 while(~scanf("%d %d",&n, &m) &&(n||m)){//n和m不必定同時爲零 ,寫成 n && m就錯 11 for(int i=0; i<n; i++) 12 scanf("%d",a+i); 13 for(int i=0; i<m; i++) 14 scanf("%d",b+i); 15 16 sort(a, a+n); 17 sort(b, b+m); 18 19 vector<int>v(110); 20 vector<int>::iterator it; 21 it = set_difference(a, a+n, b, b+m, v.begin());//set_difference()算法計算兩個集合[start1, end1)和[start2, end2)的差集, 並將差集存放到result. 22 v.resize(it-v.begin());//resize() 改變實際元素的個數。 23 24 if(v.size()==0) 25 printf("NULL\n"); 26 else{ 27 for(it=v.begin(); it!=v.end(); ++it) 28 printf("%d ",*(it)); 29 printf("\n"); 30 } 31 } 32 return 0; 33 }
(1)輸入n和m處,注意n和m是不必定同時爲零的,有可能單個爲零
(2)set end1)和[start2, end2)的差集, 並將差集存放到result.
(3)resize() 改變實際元素的個數。