马蹄集双周赛(2024年8.14~8.25)

目录

01操作

单条件和

8421码

余3码

进制查询

永恒之2

新十六进制

人脑计算机

三进制计算机

三进制计算机2

​编辑excel的烦恼


01操作


难度:黄金时间限制:1秒四 占用内存:128 M
刚学二进制的小码哥对加减乘除还不熟,他希望你帮他复习操作。
对于二进制数有如下几个操作:
1.整个二进制数加1;
2.整个二进制数减1;
3.整个二进制数乘2:
4.整个二进制数除2。
(本题不会导致最高位进退位,即若全是1,之后操作加1的情况不会出现)以上的操作是二进制数的对应操作,乘2或除2会导致进退位。
格式
输入格式:第一行两个正整数 n,m表示二进制数长度和操作数:接下来一行一个二进制数;第三行m个字符,对应操作1-4。

//
// Created by felix on 2024/8/23.
//
#include <bits/stdc++.h>
using namespace std;
const int N = 5e7 + 7;
int n, m;
char s[N], c;

int main() {
    cin >> n >> m >> s;
    while (m--) {
        cin >> c;
        switch (c) {
            case '+': {
                for (int j = n - 1; j >= 0; j--) {
                    if (s[j] == '0') {
                        s[j] = '1';
                        break;
                    } else {
                        s[j] = '0';
                    }
                }
                break;
            }
            case '-': {
                for (int j = n - 1; j >= 0; j--) {
                    if (s[j] == '1') {
                        s[j] = '0';
                        break;
                    } else {
                        s[j] = '1';
                    }
                }
                break;
            }
            case '*': {
                s[n++] = '0';
                break;
            }
            case '/': {
                s[--n] = '\0';
                break;
            }
        }
    }
    cout << s;
    return 0;
}

单条件和


难度:黄金巴 占用内存:128 M时间限制:1秒
“单条件”是数理逻辑中的5种常用连接词之一,记作“→”。它是二元运算。相当于“如果.…..那么.…”、“因为.
所以…”、“只要.….就…”等。也可称为“蕴涵”。“p→q”读作“如果p,那么q”,其中p称为前件,q称为后件。
其真值表如下:
0P→0
,一1
7见9


如“异或和”为a田az....an,我们现在要求“单条件和”,即a,→ar-..-an,对a1,a2,…,an作位意义上的单条件运算求和。

#include <bits/stdc++.h>
using namespace std;

int n;
unsigned ans, a;

int main() {
    scanf("%d", &n);
    scanf("%u", &ans);
    for (int i = 2; i <= n; i++) {
        scanf("%u", &a);
        ans = ~ans | a;
    }
    printf("%u\n", ans);
    return 0;
}

8421码


时间限制:1秒巴 占用内存:128 Mテ难度:白银
8421码是最常用的BCD码(Binary-coded Decimal),是十进制代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。其中每一位“1”代表的十进制数称为这一位的权。因为每位的权都是固定不变的,所以8421码是恒权码。
--摘自 百度百科
8421码就是将十进制的数以8421的形式展开成二进制,大家知道十进制是8~9十个数组成,这十个数每个数都有自己的8421码:0=0000,1=0001,2=0010,3=0011,4=0100,5=0101,6-0110,7=0111,8-1880,9=1001。接下来的18就有两个上述的码来表示10表示为00010000(1与8)也就是BCD码是遇见1801就产生进位,不象普通的二进制码,到1111才产生进位18000。8421码的每4位代表十进制的每一位上的数,举个例子:321的8421码就是001100100001(分别对应十进制321)本题请你将输入的十进制数字转换为8421码形式。

#include <bits/stdc++.h>
using namespace std;

char a[10][5] = {"0000", "0001", "0010", "0011", "0100",
                 "0101", "0110", "0111", "1000", "1001"};

int n;
char num[10]; // 最大是10位数字

int main() {
    cin >> n;
    while (n--) {
        cin >> num;
        int len = strlen(num);
        for (int i = 0; i < len; i++) {
            cout << a[num[i] - '0'];
        }
        cout << endl;
    }
    return 0;
}

余3码


难度:白银时间限制:1秒巴 占用内存:128 M
8421码是一种BCD码(Binary-coded Decimal),将十进制的数以8421的形式展开成二进制,大家知道十进制是0~9十个数组成,这十个数每个数都有自己的8421码: 0=0000,1=0001,2=0010,3=0011,4=0100,5=0101,6=0110,7=0111,8=1800,9=1801。接下来的10就由两个上述的码来表示,10表示为80018800(1与8)也就是BCD码是遇见1881就产生进位,不象普通的二进制码,到1111才产生进位10800。8421码的每4位代表十进制的每一位上的数,举个例子:321的8421码就是001100100001(分别对应十进制32
而余三码(余3码)是由8421BCD码加上8011形成的一种无权码,由于它的每个字符编码比相应的8421码多3,故称为余三码。BCD码的一种。余3码的特点:当两个十进制数的和是9时,相应的和的余3码正好是1111于是可自动产生进位信号,而不需修正。8和9,1和8,…..5和4的余3码互为反码,这在求对于模9的补码很方便
Decimal
2
8421BCD
0000
余3码
0011

#include <bits/stdc++.h>
using namespace std;

char a[10][5] = {"0011", "0100", "0101", "0110", "0111", 
                 "1000", "1001", "1010", "1011", "1100"};

int n;
char num[10]; // unsigned int 最大是10位

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n;
    while (n--) {
        cin >> num;
        int len = strlen(num);
        for (int i = 0; i < len; i++) {
            cout << a[num[i] - '0'];
        }
        cout << '\n';
    }

    return 0;
}

进制查询


时间限制:1秒四占用内存:128 M·难度:黄金
给出一整数n,计算用2~n-1进制表示n时,每一个进制下所有位上的数字的和的平均数(结果用分数表示)。
注意,中间过程及输出均采用10进制。
格式
输入格式:-行-个正整数 n(3 ≤n≤1000)。
输出格式:一行一个数表示答案(一定要是分数形式,比如3需要写成3/1)。
样例 1
输入:10
输出:3/1
 

#include <bits/stdc++.h>
using namespace std;

int n, fenzi, fenmu;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

int func(int k, int x) {
    int sum = 0;
    while (x > 0) {
        sum += x % k;
        x /= k;
    }
    return sum;
}

int main() {
    cin >> n;
    for (int i = 2; i <= n - 1; i++) {
        fenzi += func(i, n);
    }
    fenmu = n - 2;
    int temp = gcd(fenzi, fenmu);
    fenzi /= temp;
    fenmu /= temp;
    cout << fenzi << '/' << fenmu;
    return 0;
}

永恒之2


少 难度:钻石巴:占用内存:128 M时间限制:1秒
小码哥被困扰住了,因为电脑它又双叒叕坏了!!!
现在还是想让你算一些东西:给出一个一六进制数k,求出在1到k中2出现了多少次(1到k都用十六进制表示),其中k在十六进制下不大于10位。输出的答案请对99999989取余。
格式
输入格式:第一行一个十进制整数 n(1 ≤n≤ 10),表示k的位数;第二行一个十六进制数 k。
输出格式:一个十进制整数,表示1到k中2出现的次数对99999989取余的答案

#include <bits/stdc++.h>
using namespace std;
#define int long long

int p[15] = {1}, a[15], n, ans;
char s[15];
const int mod = 99999989;

signed main() {
    cin >> n >> s;
    for (int i = 1; i <= n; i++) {
        p[i] = p[i - 1] * 16;
    }
    for (int i = 0; i < n; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            a[i] = s[i] - '0';
        } else {
            a[i] = s[i] - 'A' + 10;
        }
    }
    for (int i = 0; i < n; i++) {
        int pre = 0, suf = 0;
        for (int j = 0; j <= i - 1; j++) {
            pre = pre * 16 + a[j];
        }
        for (int j = i + 1; j < n; j++) {
            suf = suf * 16 + a[j];
        }
        if (a[i] > 2) {
            ans = (ans + (pre + 1) * p[n - i - 1] % mod) % mod;
        } else if (a[i] < 2) {
            ans = (ans + pre * p[n - i - 1] % mod) % mod;
        } else {
            ans = (ans + suf + 1 + pre * p[n - i - 1] % mod) % mod;
        }
    }
    cout << ans;
    return 0;
}

新十六进制


乡 难度:钻石●时间限制:1秒占用内存:128 M
小码哥基于之前的十六进制定义了一种新的进制,其仍然由十六个基数构成(即0,1,2,…..,9,A,B,C,D,E,F),并且大小关系保持不变(即0<1<2<...<9<A<BくCくDくE<F),唯一不同的是数字只能按照大小关系升序排列(即11,21这样的数是不合法的,1F的下一个数是23),但前导8会被忽略(即00012等于12,也同样合法)。
现在小码哥想为这种进制制作转换器,能够把这种进制下的数转换成十进制数,但小码哥不懂怎么下手,于是他来找你帮忙。
小码哥希望对于输入的数字能进行判断,如果这个数字不合法,转换器会报错,如果合法,转换器会输出对应的十进制数。
格式
输入格式:一个字符串,为标准十六进制数。
输出格式:一个整数,表示转换成的十进制数,如果输入的十六进制数不合法,输出error。

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
char d[] = "0123456789ABCDEF";
int cnt = 1, flag = 1;
string temp, s, ss[N] = {"0"};

void dfs(int num) {
    if (temp.size()) {
        ss[cnt++] = temp;
    }
    for (int i = num + 1; i <= 15; i++) {
        temp.push_back(d[i]);
        dfs(i);
        temp.pop_back();
    }
}

bool cmp(string a, string b) {
    if (a.size() == b.size()) 
        return a < b;
    return a.size() < b.size();
}

int main() {
    dfs(0);
    cin >> s;
    if (s[0] == '-') {
        flag = -1, s.erase(s.begin());
    }
    while (s[0] == '0' && s.size() > 1) {
        s.erase(s.begin());
    }
    sort(ss, ss + cnt, cmp);
    for (int i = 0; i < cnt; i++) {
        if (ss[i] == s) {
            cout << i * flag;
            return 0;
        }
    }
    cout << "error";
    return 0;
}

人脑计算机


子 难度:白银。时间限制:1秒四占用内存:128 M
小码哥的计算机昨天坏掉了,现在他想请你帮忙算一些东西。
他会给你t-1个十进制数,请你把他们统统转化成二进制数
格式
输入格式:一个非负整数t,表示t-1组数据
下面t-1行每行一个数 n(十进制)。
输出格式:对应每个 n 给出答案。
样例 1
输入:3
复制
10
100

#include <bits/stdc++.h>
using namespace std;

int t, n;
stack<int> st;

int main() {
    cin >> t;
    t--;
    while (t--) {
        cin >> n;
        while (n) {
            st.push(n % 2);
            n = n / 2;
        }
        while (!st.empty()) {
            cout << st.top();
            st.pop();
        }
        cout << endl;
    }
    return 0;
}

二进制?不同!
多难度:黄金时间限制:1秒四占用内存:128 M
小码哥是一个对数很敏感的人,即使给他很多个很像的数串,他都能找出没有出现过的数串或许是有些无聊,小码哥给你一个字符串数组nums,里面包含几个二进制字符串(长度都为n),现请你找出不在数组中的二进制字符串。若有多解,返回对应十进制最小的一个。
格式
输入格式:一行二进制字符串数组,字符串之间以空格分割。
输出格式:一个不在数组中的二进制字符串。
样例 1
输入:01 10
输出:00
 

#include <bits/stdc++.h>
using namespace std;

vector<string> nums;
string s;

int main() {
    while (cin >> s)
        nums.push_back(s);

    int len = nums[0].length();
    int m = nums.size();
    string ans = "";
    map<int, bool> mp;

    // 转十进制
    for (int i = 0; i < m; i++) {
        int sum = 0;
        int a = 1;
        for (int j = len - 1; j >= 0; j--) {
            if (nums[i][j] == '1') {
                sum += a;
            }
            a *= 2;
        }
        mp[sum] = true;
    }

    // 转二进制字符串输出
    for (int i = 0; i < (1 << len); i++) {
        if (!mp[i]) {
            int b = i;
            int k = len;
            while (k--) {
                if (b & 1)
                    ans = '1' + ans;
                else
                    ans = '0' + ans;
                b >>= 1;
            }
            break;
        }
    }

    cout << ans;
    return 0;
}

三进制计算机


难度:黄金@时间限制:1秒巴占用内存:128 M
三进制计算机,是以三进法数字系统为基础而发展的计算机。在光子计算机研究领域也有涉及。
三进制代码的一个特点是对称,即相反数的一致性,因此它就和二进制代码不同,不存在无符号数的概念。这样,三进制计算机的架构也要简单、稳定、经济得多。其指令系统也更便于阅读,而且非常高效。
在一般情况下,命题不一定为真或假,还可能为未知。在三进制逻辑学中,符号1代表真;符号-1代表假;符号8代表未知。这种逻辑表达方式更符合计算机在人工智能方面的发展趋势,它为计算机的模糊运算和自主学习提供了可能。
在本题中,请你将输入的对称三进制数转换为对应的十进制数。对称三进制数不是用8/1/2表示,比较特殊,是用1/0/-1表示,故名对称。本题中-1用符号-表示,而1和0直接表示即可。
格式
输入格式:第一行输入一个整数 n,表示数据组数;接下来 n 行,每行输入一个对称三进制整数。

#include <bits/stdc++.h>
using namespace std;
#define int long long

int n, p[107], ans;
char s[107];

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n;
    p[0] = 1;
    for (int i = 1; i <= 100; ++i) {
        p[i] = p[i - 1] * 3;
    }
    while (n--) {
        cin >> s;
        ans = 0;
        int len = strlen(s);
        for (int i = len - 1; i >= 0; i--) {
            if (s[i] == '1') {
                ans += p[len - 1 - i];
            } else if (s[i] == '-') {
                ans -= p[len - 1 - i];
            }
        }
        cout << ans << "\n";
    }
    return 0;
}

三进制计算机2


乡难度:钻石◎ 时间限制:1秒巴 占用内存:128 M
三进制计算机,是以三进法数字系统为基础而发展的计算机。在光子计算机研究领域也有涉及
三进制代码的一个特点是对称,即相反数的一致性,因此它就和二进制代码不同,不存在无符号数的概念。这样,三进制计算机的架构也要简单、稳定、经济得多。其指令系统也更便于阅读,而且非常高效。
在一般情况下,命题不一定为真或假,还可能为未知。在三进制逻辑学中,符号1代表真;符号-1代表假;符号8代表未知。这种逻辑表达方式更符合计算机在人工智能方面的发展趋势,它为计算机的模糊运算和自主学习提供了可能。
在本题中,请你将输入的十进制数转换为对应的对称三进制数。对称三进制数不是用0/1/2表示,比较特殊,是用1/0/-1表示,故名对称,其中-1请用符号-表示,而1和0直接表示即可。
格式
输入格式:第一行输入一个整数 n,表示数据组数;接下来 几 行,每行输入一个十进制整数。

#include <bits/stdc++.h>
using namespace std;
const int N = 50;
int num[N], n, x;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n;

    while (n--) {
        cin >> x;
        memset(num, 0, sizeof(num));
        int flag = 1, cnt = 0;

        if (x < 0) {
            flag = -1;
            x = -x;
        }

        if (x == 0) {
            cout << x << "\n";
            continue;
        }

        while (x) {
            num[cnt++] = x % 3;
            x = x / 3;
        }

        for (int i = 0; i < cnt; i++) {
            if (num[i] == 2) {
                num[i] = -1;
                num[i + 1]++;
            } else if (num[i] == 3) {
                num[i] = 0;
                num[i + 1]++;
            }
        }

        if (num[cnt]) cnt++;

        if (flag == -1) {
            for (int i = cnt - 1; i >= 0; i--) {
                num[i] = -num[i];
            }
        }

        for (int i = cnt - 1; i >= 0; i--) {
            if (num[i] == -1)
                cout << "-";
            else
                cout << num[i];
        }
        cout << "\n";
    }

    return 0;
}

excel的烦恼


乡 难度:钻石时间限制:2秒四 占用内存:128 M
你用过Excel嘛?
在exce1中,第一列被标为A,第二列为B,以此类推,第26列为。接下来为由两个字母构成的列号:第27列为AA,第28列为 AB..在标为zz的列之后则由三个字母构成列号,如此类推
行号为从1开始的整数:
单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行的单元格。有时也会采用被称为RXCY的坐标系统,其中x与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。
小码哥请你编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式
格式
输入格式:第一行一个整数 T(1 ≤ T < 105)表示将有 T 次询问;接下来 T 行,每行一个坐标;输出 T 行,每行一个被转换的坐标。

#include <bits/stdc++.h>
using namespace std;

string str;
int T, len;

void trans(bool mode) {
    char apt[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // alphabet 字母表
    int col = 0, row = 0;
    if (mode) { // mode 1: RXCY转Excel式
        int R = str.find("R"), C = str.find("C"); // 找到R与C位置;
        for (int i = R + 1; i < C; i++)
            row = row * 10 + str[i] - '0';
        for (int i = C + 1; i < len; i++)
            col = col * 10 + str[i] - '0';
        string ans;
        while (col > 0) {
            int temp = col % 26; // 除26取余,向前;
            if (temp == 0)
                temp = 26, col -= 26; // 当col对应字母为'Z'时,需要进行特别判断;
            ans += apt[temp];
            col /= 26;
        }
        reverse(ans.begin(), ans.end());
        cout << ans << row << endl;
    } else { // mode 0: Excel式转为RXCY式
        for (int i = 0; i < len; i++) { // 遍历字符串
            if (isdigit(str[i]))
                break; // 前半截字母部分
            col = col * 26 + str[i] - 'A' + 1;
        }
        row = 0;
        for (int i = 0; i < len; i++) { // 后半截数字部分
            if (isdigit(str[i])) {
                row = row * 10 + str[i] - '0';
            }
        }
        cout << "R" << row << "C" << col << endl;
    }
}

int main() {
    cin >> T;
    for (int i = 1; i <= T; i++) {
        cin >> str;
        bool flag = 0, mode = 0; // 两种模式根本区别在于会否数字后面出现一个C
        len = str.length();
        for (int i = 0; i < len; i++) {
            if (isdigit(str[i]))
                flag = 1; // flag用来标记数字是否已经出现;
            if (flag && str[i] == 'C') {
                mode = 1; // 表示肯定为RXCY
                break;
            }
        }
        trans(mode);
    }
    return 0;
}

万物有灵

靠近哲学 

偶然的一次机会

马里亚纳海沟

第二阶段 派 

关于信仰 

陷入了迷茫 

急速下沉 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值