18.5.12 c++选做题#4

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 }

被比赛突然结束所支配的恐惧……

(为什么还有限时啊我还以为起码会到考试之前都开的)

(至少开到12点啊我还能再抢救一下啊)

(没做完好不爽啊!!)

不管对不对先存在这吧 没准下次又开了呢(冷静分析)

原文地址:https://www.cnblogs.com/yalphait/p/9030625.html

时间: 2024-08-29 04:45:33

18.5.12 c++选做题#4的相关文章

课后选做题-MyOD

课后选做题-MyOD od命令的了解 功能 od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符.od命令系统默认的显示方式是八进制,名称源于Octal Dump. 常见的文件为文本文件和二进制文件.od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值. 语法 od 参数 -a 此参数的效果和同时指定

选做题:两位十进制转换为二进制

#include<stdio.h> int main(void){ int i=0,n,a[32]; printf("请输入一个十进制整数:\n"); scanf("%d",&n); while(n>0) { a[i]=n%2; i=i+1; n=n/2; } printf("十进制整数转换为二进制数是:\n"); for(i--;i>=0;i--) printf("%d",a[i]); pri

3/25 本周选做题

def auth(path): from functools import wraps global money def outter1(func): @wraps(func) def wrapper(*args, **kwargs): import time time1 = time.strftime('%Y-%m-%d %X') func() print(func.__name__, type(func.__name__)) with open(r'{}'.format(path), 'a'

选做题

有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. package test; public class test6 { public static void main(String[] args) { // TODO Auto-generated method stub int[] m = {0,1,3,4}; int[] m2 = new int[5]; int a = 2; for(int i =0; i< m.length; i++){ if(m[i] > a){

[SDOI2016]部分题选做

听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4517 数论题,我这种不会错排的数论白痴都能手推出来,这题应该谁都能写吧. #include<cstdio> #include<cstring> #include<algorithm> #define mo 1000000007 #define ll long long #define N 1000100 using nam

hdu--4432--好久没做题了.

很久没做题了...一想到要去 遥远的 牡丹江 我就------------- 这题 没什么好说的 就是个十进制的数转换成任意进制的数 就是要注意下 10进制以上的数 10是表示为A 11表示为B ......... 好 贴代码 继续做一两题. 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 vector<int>ve; 6 int num[110]; 7 int sum , n ,

做题细节

1. 如果题目是枚举的话,即最后化成十分简单的形式比较小, 可以直接将各种不同状态的结果运算过程写出来,但是这并不见得比写函数要快多少 而且比较容易出错,比如下标没有更改之类,这种错误比较烦人,因为你会查看算法, 但是算法本身并没有错误,所以如果复制粘贴的话,注意不同情况的不同点,如果自己 不够细心,最好写成函数的形式(注意判断边界),以防出错.//16:35 2004-4-17 2. 在编程之后检查的第一件事就是初始化, 你的初始化也许写在循环体之外,故只能AC一组测试数据,sample. /

bzoj5108 [CodePlus2017]可做题 位运算dp+离散

[CodePlus2017]可做题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 87  Solved: 63[Submit][Status][Discuss] Description qmqmqm希望给sublinekelzrip出一道可做题.于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需 要计算其异或前缀和bi,满足条件b1=a1,bi=bi?1 xor ai(i≥2).但是由于数据生成器出现了问题,他生成的序列a 的长度特

在 大家的做题热情实在是高 故开新帖继续做题 中 的 回复

本文 是  <做一道 高一 求 函数 值域 的 题>  https://www.cnblogs.com/KSongKing/p/12233398.html   的   续篇,  呵呵呵呵  . <做一道 高一 求 函数 值域 的 题>  里 做的 是 网友 暮色星辰ing (Suzuha)  先前发的 一个 贴 里的 题, 这个 帖 是 <高一狗流下了泪水 求大佬帮助>  ,  不过 这个 帖 已经 被 Suzuha  自己 删了,  据说是 “问题解决了,  就把 帖