ACM题解Day5| 进制转化专栏| 10进制转化为2进制 , 8进制转换为10进制,16进制内通用解法,x 进制转 10 进制

学习目标:

博主介绍: 27dCnc
专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆

Github今日打卡
在这里插入图片描述

  • ACM题解

学习时间:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习内容:

  1. Bitset
  2. Octal Fractions(C)
  3. 年号字串
  4. x 进制转 10 进制

内容详细:

Bitset

题目考点: 进制转化 (10进制转化为2进制) 字符串 (二进制数字转化为字符串)

在这里插入图片描述

解题思路:
只要看到二进制转化C++ 便可想到一个函数 bitset<32>(n) 但是这个函数有给 bug 如图

bug 如图
在这里插入图片描述

如图会将前导0输出导致不能得到正确结果

解决方案: 将前导0去除, 思路 --> 转化为字符串(从左往右)找第一个不是0的字符,任何输出后面的字符即可

详细代码


#include<bits/stdc++.h>
#include <bitset>
#define Run 0
#define endl "\n"
#define N 100005
using unl = __int128_t;
using ll = long long;
using namespace  std;
char str_[1005][105];
char str[1005][105];

//bitset<32> 去除前导0
class Solution {
public:
      bool Palindrome(string s) {
          for (int  i = 0 ,k = s.size() - 1; i < s.size() / 2; i++,k--) {
              if(s[i] != s[k]) return false;
          }
          return true;
      }
      
      char Ttans(char str) { /*确定旋转后的*/
          switch (str)
          {
              case '>': return 'v';
              case 'v': return '<';
              case '^': return '>';
              case '<': return '^';
          }
          return '.';
      }
      
      void slove() {
        int n;
        while (cin >> n) {  
          // 二进制转换为字符串
            string s = bitset<32>(n).to_string(); // 将整数 n 转换为 32 位二进制字符串
            s.erase(0, s.find_first_not_of('0'));  //保留S第一个不为0的数
            cout << s << endl;
        }
      }
};

signed main() {
    cin.tie(0) -> ios::sync_with_stdio(0);
    cout.tie(0) -> ios::sync_with_stdio(0);
    #if Run
        int _;cin>>_;while(_--) Solution().slove();
    #else
        Solution().slove();
    #endif
    return 0;
}

在这里插入图片描述
其他思路: 可以直接10进制转化为二进制即可

进制转化代码思路:

  • 进制转化可以考虑导计算机储存为二进制可以用库函数进行转化
  • 手动转换思路:
  1. 先每位乘与相应权重
  2. 然后和10进制转2进制一样除以相应权重储存导数组中然后输出

知识点讲解:

to_string()

在C++中,std::to_string() 函数可以将基本数据类型(如整数、浮点数等)转换为对应的字符串

#include <iostream>
#include <string>

int main() {
    int number = 42; // 一个整数

    // 将整数转换为字符串
    std::string str = std::to_string(number);

    std::cout << "Number as string: " << str << std::endl;

    // 对字符串进行操作
    char c = str[1]; // 获取第二个字符 '2'
    std::cout << "Character at index 1: " << c << std::endl;

    return 0;
}

int 类型转换为字符串有几种常用的方法:

  1. 使用 std::to_string() 函数:

    #include <string>
    #include <iostream>
    
    int main() {
        int number = 42;
        std::string str = std::to_string(number);
        std::cout << "Number as string: " << str << std::endl;
        return 0;
    }
    
  2. 使用流操作符 << 将整数输出到 std::ostringstream,然后获取其字符串表示:

    #include <string>
    #include <iostream>
    #include <sstream>
    
    int main() {
        int number = 42;
        std::ostringstream oss;
        oss << number;
        std::string str = oss.str();
        std::cout << "Number as string: " << str << std::endl;
        return 0;
    }
    
  3. 使用 sprintf 函数(需要注意安全性问题):

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    
    int main() {
        int number = 42;
        char buffer[20];
        sprintf(buffer, "%d", number);
        std::string str(buffer);
        std::cout << "Number as string: " << str << std::endl;
        return 0;
    }
    

Octal Fractions(C)

题目考点: 小数进制转换 格式输出

在这里插入图片描述
思路: 手动转换乘与权重
注意: 8进制要以字符串的形式输入
算法实现过程:

在这里插入图片描述

详细代码:

#include <bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 100000
using unl = __int128_t;
using ll = long long;
using namespace std;

class Solution
{
public:
    void slove()
    {
        string ch;
        while (cin >> ch)
        { // 以字符的方式读入
            int ans[100000];
            int len = 0, d = 0, t = 0;
            for (int i = ch.size() - 1; i > 1; i--)
            {
                d = ch[i] - '0'; // 将字符转换为数字
                // d用来储存每一位的数字
                int k = 0, j = 0;

                while (j < t || d)
                {
                    d = d * 10 + ans[j++];  //这里在执行进制转换算法
                    ans[k++] = d / 8;  //最后的数储存在ans中
                    d = d % 8;
                }
                t = k; //储存遍历次数
            }
            cout << ch << " " 
                 << "[8]"
                 << " "
                 << "="
                 << " "
                 << "0.";

            for (int i = 0; i < t; i++)  //输出ans中的值
            {
                cout << ans[i];
            }
            cout << " " << "[10]" << endl;
            for (int i = 0; i < t; i++)  
            {
                ans[i] = 0;  //清空数据到下一个数据来
            }
        }
    }
};

signed main() {
    cin.tie(0) -> ios::sync_with_stdio(0);
    cout.tie(0) -> ios::sync_with_stdio(0);
    #if Run
        int _;cin>>_;while(_--) Solution().slove();
    #else
        Solution().slove();
    #endif
    return 0;
}

PS: 小数部分有点没有理解到蹲小数部分进制转换教程

年号字串

题目考点: 进制转换 数组下标

在这里插入图片描述
题解代码:

#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 100005
using unl = __int128_t;
using ll = long long;
using namespace  std;
int a[N];
char str[27]={0,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};


class Solution {
public:
    void slove(auto _) {
    int n; cin >> n;
    a[3] = 2; a[4] = 3;
    for (int i = 5; i <= N; i++) {
        if ((i % 3 && (i + 1) % 3) || i % 3 == 0) {
            a[i] = a[i - 1] + 1;
        } else {
            a[i] = a[i - 1];
        }
    }
    cout << a[n] << endl;
    }

    void decimalTo26(ll n) {
    string result;
    while (n > 0) {  //只要我们的10进制没有到最后
        ll remainder = n % 26; //除以权重每一位
        if (remainder == 0) { 
            result = 'Z' + result; //当刚好等于26时
            n = (n / 26) - 1; //减去1
        } else {
            result = str[remainder] + result; //否则转换为字符串
            n = n / 26; //下一位
        }
    }
        cout << result << endl;
    }

};

signed main() {

    cin.tie(0) -> ios::sync_with_stdio(0);
    cout.tie(0) -> ios::sync_with_stdio(0);

    #if Run
        auto _;cin>>_;while(_--) Solution().slove(_);
    #else
        ll _; while(cin >> _) Solution().decimalTo26(_);
    #endif

    return 0;
}

进制转换小结:

进制转换可以将进制转换为一个进制在由这个进制转换为其他进制,也可以直接转换于是我总结出一个进制转换模板

#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 100005
using unl = __int128_t;
using ll = long long;
using namespace  std;
// 2 - 16
class Solution {
public:
    void slove() {
        int n, m;
        int count = 0;
        string s;
        // n为当前进制 s 为要转换的进制数 m 为要转换成为的进制
        cin >> n >> s >> m;
        
        for (int i = 0; i < s.size(); i++) {
            for (int j = 0; j < 16; j++) {
                if (a[j] == s[i]) {
                    count = count * n + j; //乘与相应权重 -> 转化为10进制
                }
            }
        }
        
        int d[N];
        int i = 0;
        while (count) { 
            d[i] = count % m; // 10进制 转化 -> m 进制
            count /= m; // 除与相应权重
            i++; 
        }
        
        for (int j = i - 1; j >= 0; j--) {
            if (d[j] >= 10)
                cout << (char)(d[j] + 'A' - 10);
            else
                cout << d[j];
        }
    }

private:
    int d[N];
    char a[17] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
};


signed main() {

    cin.tie(0) -> ios::sync_with_stdio(0);
    cout.tie(0) -> ios::sync_with_stdio(0);

    #if Run
        int _;cin>>_;while(_--) Solution().slove(_);
    #else
        Solution().slove();
    #endif

    return 0;
}


题目加餐

x 进制转 10 进制

题目考点: 进制转换

在这里插入图片描述
详细代码

#include<bits/stdc++.h>
#define Run 0
#define endl "\n"
#define N 100005
using unl = __int128_t;
using ll = long long;
using namespace  std;

class Solution {
public:
    void slove() {
        int n; char s[105]; cin >> n >> s;
        cout << strtol(s, nullptr, n) << endl;
    }

private:
    int d[N];
    char a[40] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
};


signed main() {

    cin.tie(0) -> ios::sync_with_stdio(0);
    cout.tie(0) -> ios::sync_with_stdio(0);

    #if Run
        int _;cin>>_;while(_--) Solution().slove(_);
    #else
        Solution().slove();
    #endif

    return 0;
}


PS: 事实证明前面那个总结只能用于16进制以内的进制转换超过要另外想办法

相应题目巩固:

  1. 进制转换
  2. 进制转换

知识点补充

在这里插入图片描述
在这里插入图片描述


学习产出:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个

在这里插入图片描述

重磅消息:

GTP - 4 最新版接入服务他来了 点击链接即可查看详细

GTP - 4 搭建教程

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值