集合的前N個元素:編一個程式,按遞增次序生成集合M的最小的N個數,M的定義如下:
(1)數1屬於M;
(2)如果X屬於M,則Y=2*x+1和Z=3*x+1也屬於M;
(3)此外再沒有別的數屬於M。
【分析】
可以用兩個佇列a和b來存放新產生的數,然後通過比較大小決定是否輸出,具體方法如下:
(1)令fa和fb分別為佇列a和佇列b的頭指標,它們的尾指標分別為ra和rb。初始時,X=1,fa=fb=ra=rb=1;
(2)將2*x+1和3*x+1分別放入佇列a和佇列b的隊尾,尾指標加1。 即:a[r]←2*x+1,b[r]←3*x+1,r←r+1;
(3)將佇列a和佇列b的頭結點進行比較,可能有三種情況:
(A)a[ha]>b[hb] (B)a[ha]=b[hb] (C)a[ha]<b[hb]
將比較的小者取出送入X,取出數的佇列的頭指標相應加1。
(4)重複(2),(3)直至取出第N項為止。
非stl
1 #include<iostream> 2 using namespace std; 3 int a[10001]; 4 int b[10001]; 5 int ha=1,ta; 6 int hb=1,tb; 7 int n; 8 int tot=1; 9 int x=1; 10 int main() 11 { 12 int n; 13 cin>>n; 14 while(tot<=n) 15 { 16 cout<<x<<" "; 17 ta++; 18 tb++; 19 a[ta]=2*x+1; 20 b[tb]=3*x+1; 21 if(a[ha]>b[hb]) 22 { 23 x=b[hb]; 24 hb++; 25 } 26 else if(a[ha]<b[hb]) 27 { 28 x=a[ha]; 29 ha++; 30 } 31 else 32 { 33 x=a[ha]; 34 ha++; 35 hb++; 36 } 37 tot++; 38 } 39 //cout<<tot; 40 return 0; 41 }
stl:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 int tot=1; 5 int x=1; 6 int main() 7 { 8 queue<int>a; 9 queue<int>b; 10 int n; 11 cin>>n; 12 while(tot<=n) 13 { 14 cout<<x<<" "; 15 a.push(2*x+1); 16 b.push(3*x+1); 17 if(a.front()>b.front()) 18 { 19 x=b.front(); 20 b.pop(); 21 } 22 else if(a.front()<b.front()) 23 { 24 x=a.front(); 25 a.pop(); 26 } 27 else 28 { 29 x=a.front(); 30 a.pop(); 31 b.pop(); 32 } 33 tot++; 34 } 35 return 0; 36 }