进制转化复习( 万能的a进制转化为b进制)

进制转化复习

十进制转化为十六进制

Description

  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。

Input

输入描述:
  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输入样例:
30

Output

输出描述:
  输出这个整数的16进制表示
输出样例:
1E


#include <bits/stdc++.h> using namespace std; const int N = 20; int a[N]; int n; int cnt; int main() { cin>>n; char b[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; do { a[cnt++]=n%16; n/=16; }while (n); for (int i=cnt-1;i>=0;i--) { int index = a[i]; cout<<b[index]; } puts(""); return 0; }

十进制转化为二进制(除留余数法)

#include <bits/stdc++.h> using namespace std; const int N = 35; int n; int a[N]; int cnt; int main() { cin>>n; do{ a[cnt++]=n%2; n/=2; } while (n); for (int i=cnt-1;i>=0;i--) cout<<a[i]; puts(""); return 0; }

十六进制转化为十进制

#include <bits/stdc++.h> using namespace std; int main() { string a_line,b_line; cin>>a_line; vector<int>num; for (auto c:a_line) { if (c>='A'&&c<='F') num.push_back(c-'A'+10); else num.push_back(c-'0'); } reverse(num.begin(),num.end()); vector<int>ans; while (num.size()) { int r=0; for (int i=num.size()-1;i>=0;i--) { num[i]+=r*16; r=num[i]%10; num[i]/=10; } ans.push_back(r); while (num.size()&&num.back()==0) num.pop_back(); } reverse(ans.begin(),ans.end()); for (auto x:ans) cout<<x; cout<<endl; return 0; }

a进制转化为b进制

编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。

这里有 62 个不同数位 09,AZ,az

输入格式

第一行输入一个整数,代表接下来的行数。

接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。

输入进制和输出进制都在 262 的范围之内。

(在十进制下)A=10B=11Z=35a=36b=37z=61 (09 仍然表示 09)。

输出格式

对于每一组进制转换,程序的输出都由三行构成。

第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。

第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。

第三行为空白行。

同一行内数字用空格隔开。

输入样例:

8 62 2 abcdefghiz 10 16 1234567890123456789012345678901234567890 16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 23 333YMHOUE8JPLT7OX6K9FYCQ8A 23 49 946B9AA02MI37E3D3MMJ4G7BL2F05 49 61 1VbDkSIMJL3JjRgAdlUfcaWj 61 5 dl9MDSWqwHjDnToKcsWE1S 5 10 42104444441001414401221302402201233340311104212022133030

输出样例:

62 abcdefghiz 2 11011100000100010111110010010110011111001001100011010010001 10 1234567890123456789012345678901234567890 16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2 35 333YMHOUE8JPLT7OX6K9FYCQ8A 35 333YMHOUE8JPLT7OX6K9FYCQ8A 23 946B9AA02MI37E3D3MMJ4G7BL2F05 23 946B9AA02MI37E3D3MMJ4G7BL2F05 49 1VbDkSIMJL3JjRgAdlUfcaWj 49 1VbDkSIMJL3JjRgAdlUfcaWj 61 dl9MDSWqwHjDnToKcsWE1S 61 dl9MDSWqwHjDnToKcsWE1S 5 42104444441001414401221302402201233340311104212022133030 5 42104444441001414401221302402201233340311104212022133030 10 1234567890123456789012345678901234567890

image-20230401110332733

#include<bits/stdc++.h> using namespace std; int main() { ios; int T; //输入样例的个数 cin >> T; while(T--) { //读入 ios; int a,b; string a_line,b_line; cin >> a >> b>>a_line; //由a进制转换成b进制 vector<int> number; //number来存储由str转换成10进制的数据 for(auto c : a_line) { if(c>='0' && c<='9') number.push_back(c-'0'); //str转int形数据,因为无需根据偏移量转换,所以是减去0 if(c>='A' && c<='Z') number.push_back(c-'A'+10); //通过与A的偏移量来进行转换 if(c>='a' && c<='z') number.push_back(c-'a'+36); //减去0到9和大写的26个英文字母的偏移量 } reverse(number.begin(),number.end()); //存储时我们是把高位放在了下标为0的位置,y总习惯从低位到高位存,使位数和数组的下标一致 vector<int> res; while(number.size()) //numberz只要没被除成0就一直做 { int r = 0; //余数 for(int i = number.size() - 1; i >= 0; i--) { number[i] += r * a; // 当前这一位的值 是 :当前这一位的值 + 上一位的借位 * a (因为一开始是a进制的,所以需要乘以a) r = number[i] % b; //每一位再对b取余得到每一位 number[i] /= b; // 商的位 是number的位整除b的结果 } res.push_back(r); //最后的余数就是我现在的个位 while(number.size() && number.back() == 0/*!number.back()*/) number.pop_back(); //删去前导0 } reverse(res.begin(),res.end()); //因为短除法是push_back()的次序是 从上到下 的每一次余数, //但是我们输出的时候要逆序输出,所以再reverse一次 for (auto x : res) //如果是10进制以内的转换 我们直接输出就可以了现在,但是 这儿最高是62进制 要再进行一个转换! { if (x <= 9) b_line += char(x + '0'); if (x >= 10 && x <= 35) b_line += char(x + 'A' - 10); if (x >= 36) b_line += char(x + 'a' - 36); } cout << a << ' ' << a_line << endl; cout << b << ' ' << b_line << endl; cout << endl; } return 0; }

进制转化万能模板题目强化

3373. 进制转换 - AcWing题库

将一个长度最多为 30 位数字的十进制非负整数转换为二进制数输出。

输入格式

输入包含多组测试数据。

每组测试数据占一行,包含一个长度不超过 30 位的十进制非负整数。

输出格式

每组数据输出一个结果,占一行,为输入对应的二进制数。

数据范围

输入最多包含 100 组测试数据。

输入样例:

0 1 3 8

输出样例:

0 1 11 1000

#include <bits/stdc++.h> using namespace std; int main() { string a; while (cin>>a) { vector<int>num; for (auto x:a) num.push_back(x-'0'); reverse(num.begin(),num.end()); vector<int>ans; while (num.size()) { int r = 0; for (int i=num.size()-1;i>=0;i--) { num[i]+=r*10; r=num[i]%2; num[i]/=2; } ans.push_back(r); while (num.size()&&num.back()==0) num.pop_back(); } reverse(ans.begin(),ans.end()); for (auto x: ans) cout<<x; cout<<endl; } return 0; }

3374. 进制转换2 - AcWing题库

M 进制的数 X 转换为 N 进制的数输出。

输入格式

第一行包括两个整数:MN

第二行包含一个数 $ X X M M X N $ 进制的数输出。

输出格式

共一行,输出 XN 进制表示。

数据范围

$ 2 \le N,M \le 36 , X 100 10 A \sim Z 10 \sim 35 10 a \sim z 10 \sim 35 $。

输入样例:

10 2 11

输出样例:

1011

#include <bits/stdc++.h> using namespace std; int m,n; int main() { cin>>m>>n; string a; cin>>a; vector<int>num; for (auto c:a) { if (c>='0'&&c<='9') num.push_back(c-'0'); else num.push_back(c-'A'+10); } reverse(num.begin(),num.end()); vector<int>ans; while (num.size()) { int r = 0; for (int i=num.size()-1;i>=0;i--) { num[i]+=m*r; r=num[i]%n; num[i]/=n; } ans.push_back(r); while(num.size()&&num.back()==0) num.pop_back(); } reverse(ans.begin(),ans.end()); string res; for (auto c:ans) { if (c>=0&&c<=9) res+=char(c+'0'); else res+=char(c+'a'-10); } cout<<res<<endl; return 0; }


__EOF__

本文作者dfl
本文链接https://www.cnblogs.com/sdnu-dfl/p/17278610.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   勇敢龙龙  阅读(168)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示