18.5.12 c++選做題#4
阿新 • • 發佈:2018-05-13
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; } }; intmain() { 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