集合的前N個元素

自為風月馬前卒發表於2017-03-28
集合的前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 }

 

相關文章