每日算法系列【EOJ 3031】二进制倒置

简介: 每日算法系列【EOJ 3031】二进制倒置

题目描述

给定一个整数  、将  的 334 位二进制表示形式(不包括开头可能的值为 0 的位, 表示为 1 位 0)前后倒置,输出倒置后的二进制数对应的整数。

例如:  ,其二进制表示为(330 个 0)1010 ,倒置后为 0101 ,对应输出就是 5 。

题目链接

https://acm.ecnu.edu.cn/problem/3031/

题解

这题考查的主要是大数的进制转换,其他没有什么算法技巧,但是对代码实现要求还是挺高的,适合用来锻炼你的耐心代码风格

整体思路非常简单,不就是先把输入的 10 进制数  转化成 2 进制数  ,再把  所有位颠倒过来,最后再把  转化成 10 进制输出就行了。

所以整体代码拆分成了三步,先从 10 进制转 2 进制,再颠倒 2 进制,最后从 2 进制转 10 进制。

为了代码的普适性,我这里直接实现了从任意  进制 转化为任意  进制的算法,这样更加方便调用。

这就涉及到了大数的任意进制转换问题,假设  是  进制数,我们要把它转化为  进制的  (初始时为空)。那么转化步骤如下:

  • 求  ,并把余数接在  的最高位。
  • 令  。
  • 重复步骤 1 ,直到  。

部分代码如下:

while (n > 0) {
    y.push_back(mod(x, a, b));
    div(x, a, b);
    n = x.size();
    if (n == 1 && !x[0]) break;
}

看起来非常简单,但是步骤 1 和 2 都涉及到了大数的求余大数的除法算法,所以我们还得实现这两个算法。

大数求余只要从  最高位开始计算  的大小,并同时对  求余,然后由于求余的加法和乘法定理,我们可以始终保持  ,这样就能用一个 int 类型保存余数了。

部分代码如下:

int mod(vector<int>& x, int a, int b) {
    int n = x.size(), q = 0;
    for (int i = n-1; i >= 0; --i) {
        q = (q * a + x[i]) % b;
    }
    return q;
}

大数除法类似,从  最高位开始除  ,并注意要把余数带到下一位,最后还得去掉前导 0 。

部分代码如下:

void div(vector<int>& x, int a, int b) {
    int n = x.size(), q = 0;
    for (int i = n-1; i >= 0; --i) {
        x[i] += q * a;
        q = x[i] % b;
        x[i] /= b;
    }
    for (int i = n-1; i > 0; --i) {
        if (x[i]) break;
        x.pop_back();
    }
}

代码

c++

#include <bits/stdc++.h>
using namespace std;
// string转化为vector<int>,倒序存储
vector<int> s2i(string& s) {
    vector<int> x;
    int idx = 0, n = s.size();
    for (; idx < n; ++idx) {
        if (s[idx] != '0') break;
    }
    if (idx == n) idx = n - 1;
    for (int i = n-1; i >= idx; --i) {
        x.push_back(s[i]-'0');
    }
    return x;
}
// a进制下x%b,x倒序存储
int mod(vector<int>& x, int a, int b) {
    int n = x.size(), q = 0;
    for (int i = n-1; i >= 0; --i) {
        q = (q * a + x[i]) % b;
    }
    return q;
}
// a进制下x/b,x倒序存储
void div(vector<int>& x, int a, int b) {
    int n = x.size(), q = 0;
    for (int i = n-1; i >= 0; --i) {
        x[i] += q * a;
        q = x[i] % b;
        x[i] /= b;
    }
    for (int i = n-1; i > 0; --i) {
        if (x[i]) break;
        x.pop_back();
    }
}
// a进制下s转化为b进制string
string convert(string s, int a, int b) {
    vector<int> x = s2i(s);
    int n = x.size();
    vector<int> y;
    while (n > 0) {
        y.push_back(mod(x, a, b));
        div(x, a, b);
        n = x.size();
        if (n == 1 && !x[0]) break;
    }
    int m = y.size();
    string res = "";
    for (int i = m-1; i >= 0; --i) {
        res += '0' + y[i];
    }
    return res; 
}
int main() {
    int T;
    cin >> T;
    string x;
    for (int t = 0; t < T; ++t) {
        cin >> x;
        string x2 = convert(x, 10, 2);
        reverse(x2.begin(), x2.end());
        string res = convert(x2, 2, 10);
        cout << "case #" << t << ":" << endl;
        cout << res << endl;
    }
    return 0;
}

python

x = int(input())
for i in range(x):
    print("case #%d:" %i)
    print(int(str(bin(int(input())))[2::][::-1], 2))
相关文章
|
9月前
|
存储 算法
数组算法:倒置,查找,插入,删除
数组算法:倒置,查找,插入,删除
69 0
|
9月前
|
算法 测试技术
算法强化每日一题--倒置字符串
算法强化每日一题--倒置字符串
|
算法
例题:1.正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数 2.将一句话的单词进行倒置,单词之间空格,标点不倒置,字母不超100
例题:1.正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数 2.将一句话的单词进行倒置,单词之间空格,标点不倒置,字母不超100
137 0
|
机器学习/深度学习 自然语言处理 算法
|
2天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
2天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
2天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1
|
2天前
|
存储 算法 数据可视化
基于harris角点和RANSAC算法的图像拼接matlab仿真
本文介绍了使用MATLAB2022a进行图像拼接的流程,涉及Harris角点检测和RANSAC算法。Harris角点检测寻找图像中局部曲率变化显著的点,RANSAC则用于排除噪声和异常点,找到最佳匹配。核心程序包括自定义的Harris角点计算函数,RANSAC参数设置,以及匹配点的可视化和仿射变换矩阵计算,最终生成全景图像。
|
2天前
|
算法 Serverless
m基于遗传优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
MATLAB 2022a仿真实现了遗传优化的归一化最小和(NMS)译码算法,应用于低密度奇偶校验(LDPC)码。结果显示了遗传优化的迭代过程和误码率对比。遗传算法通过选择、交叉和变异操作寻找最佳归一化因子,以提升NMS译码性能。核心程序包括迭代优化、目标函数计算及性能绘图。最终,展示了SNR与误码率的关系,并保存了关键数据。
16 1
|
2天前
|
算法 调度
考虑需求响应的微网优化调度模型【粒子群算法】【matlab】
考虑需求响应的微网优化调度模型【粒子群算法】【matlab】