学习目标:
博主介绍: 27dCnc
专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆
Github今日打卡
- ACM题解
学习时间:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
学习内容:
- Bitset
- Octal Fractions(C)
- 年号字串
- 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进制转化为二进制即可
进制转化代码思路:
- 进制转化可以考虑导计算机储存为二进制可以用库函数进行转化
- 手动转换思路:
- 先每位乘与相应权重
- 然后和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
类型转换为字符串有几种常用的方法:
-
使用
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; }
-
使用流操作符
<<
将整数输出到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; }
-
使用
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进制以内的进制转换超过要另外想办法
相应题目巩固:
知识点补充
学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 3 篇
- 习的 vlog 视频 1 个
重磅消息:
GTP - 4 最新版接入服务他来了 点击链接即可查看详细
🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~