1. 程式人生 > >18.5.12 c++選做題#4

18.5.12 c++選做題#4

AR 構造函數 提示 OS [] his set truct 引用

4:自己實現bitset

描述程序

填空,實現一個類似STL bitset的 MyBitset, 輸出指定結果

#include <iostream>
#include <cstring>
using namespace std;
template <int bitNum>
struct MyBitset 
{
    char a[bitNum/8+1];
    MyBitset() { memset(a,0,sizeof(a));};
    void Set(int i,int v) {
        char & c = a[i/8
]; int bp = i % 8; if( v ) c |= (1 << bp); else c &= ~(1 << bp); } // 在此處補充你的代碼 void Print() { for(int i = 0;i < bitNum; ++i) cout << (*this) [i]; cout << endl; } }; int
main() { int n; int i,j,k,v; while( cin >> n) { MyBitset<20> bs; for(int i = 0;i < n; ++i) { int t; cin >> t; bs.Set(t,1); } bs.Print(); cin >> i >> j >> k >> v; bs[k]
= v; bs[i] = bs[j] = bs[k]; bs.Print(); cin >> i >> j >> k >> v; bs[k] = v; (bs[i] = bs[j]) = bs[k]; bs.Print(); } return 0; }

輸入

多組數據
每組數據:
第一行是整數 n , 1 <= n < 20;
第二行是n個整數 k1,k2... kn,均在範圍 [0,19]內。
第三行是 四個整數 i1,j1,k1,v1 。 0 <= i1,j1,k1 <= 19, v1值為0或1
第三行是 四個整數 i2,j2,k2,v2 。 0 <= i2,j2,k2 <= 19, v2值為0或1

輸出

對每組數據,共輸出3行,每行20位,每位為1或者0。最左邊稱為第0位
第一行: 第 k1,k2 ... kn位為1,其余位為0。
第二行: 將第一行中的第 i1,j1,k1位變為 v1,其余位不變
第三行: 將第二行中的第i2位和k2位變為v2,其余位不變樣例輸入

4
0 1 2 8
7 19 0 1
7 2 8 0
1
1
1 1 1 0
1 1 1 1

樣例輸出

11100000100000000000
11100001100000000001
11100000000000000001
01000000000000000000
00000000000000000000
01000000000000000000

提示推薦使用內部類,內部類中使用引用成員。引用成員要在構造函數中初始化。

來源

Guo Wei

技術分享圖片
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 template <int bitNum>
 5 struct MyBitset
 6 {
 7     char a[bitNum / 8 + 1];
 8     MyBitset() { memset(a, 0, sizeof(a)); };
 9     void Set(int i, int v) {
10         char & c = a[i / 8];
11         int bp = i % 8;
12         if (v)
13             c |= (1 << bp);
14         else
15             c &= ~(1 << bp);
16     }
17     // 在此處補充你的代碼
18     class bsp {
19     public:
20         int hext[20], flag;
21         bsp() { flag = 0; 
22         memset(hext, 0, sizeof(int) * 20);
23         }
24         int&operator()(int x,MyBitset&k) {
25             if (!flag) {
26                 for (int i = 0; i <= bitNum / 8 + 1; i++) {
27                     int l = k.a[i]; int c = 8*i;
28                     while (l > 0) {
29                         if(l%2)
30                             hext[c]++;
31                         c++;
32                         l/= 2;
33                     }
34                 }
35                 flag = 1;
36             }
37             return hext[x];
38         }
39     };
40     bsp b;
41     int&operator[](int x) {
42         return b(x,*this);
43     }
44     //code ends
45     void Print() {
46         for (int i = 0; i < bitNum; ++i)
47             cout << (*this)[i];
48         cout << endl;
49     }
50 
51 };
52 
53 int main()
54 {
55     int n;
56     int i, j, k, v;
57     while (cin >> n) {
58         MyBitset<20> bs;
59         for (int i = 0; i < n; ++i) {
60             int t;
61             cin >> t;
62             bs.Set(t, 1);
63         }
64         bs.Print();
65         cin >> i >> j >> k >> v;
66         bs[k] = v;
67         bs[i] = bs[j] = bs[k];
68         bs.Print();
69         cin >> i >> j >> k >> v;
70         bs[k] = v;
71         (bs[i] = bs[j]) = bs[k];
72         bs.Print();
73     }
74     return 0;
75 }
View Code

被比賽突然結束所支配的恐懼……

(為什麽還有限時啊我還以為起碼會到考試之前都開的)

(至少開到12點啊我還能再搶救一下啊)

(沒做完好不爽啊!!)

不管對不對先存在這吧 沒準下次又開了呢(冷靜分析)

18.5.12 c++選做題#4