更好的阅读体验
–> 沈七
十进制转任意进制
转换流程
1.每次取出 要转化的数 与 要转化的进制 的余数
2.将余数根据大小,转化成要对应进制的正确表达形式
3.将最后得到的字符串翻转
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string s;
int main()
{
LL x;
cin>>x;
while(x)
{
int a = x % 36; x/=36;
if(a<10)
s += a + '0';
else
s += a - 10 + 'A';
}
reverse(s.begin(),s.end());
cout<<s;
return 0;
}
经典习题
数圈圈
第一届ACC杯(初赛)A题
十六进制是一种基数为 16 的计数系统,是一种逢 16 进 1 的进位制。
通常用数字 0、1、2、3、4、5、6、7、8、9和字母 A、B、C、D、E、F 表示,其中: A∼F 表示 10∼15
,这些称作十六进制数字。观察这些数字的图案,我们可以发现,有些数字上面包含圈圈,具体来说:
数字 0,4,6,9,A,D 中包含一个圈。
数字 8,B中包含两个圈。
数字 1,2,3,5,7,C,E,F 中不含圈。
现在,给定一个十进制整数 n,请你将其转化为十六进制表示,
并数一数其十六进制表示中一共含有多少个圈圈。
输入格式
一个整数 n
输出格式
一个整数,表示整数 n 的十六进制表示包含的圈圈总数。
前三个测试点满足 0≤n≤100, 所有测试点满足 0≤n≤2×10^9 。
输入样例1:
11
输出样例1:
2
题解部分:
在转换进制的时候,特判一下每一位数就好了
#include<bits/stdc++.h>
using namespace std;
string s;
long long ans,n;
int main()
{
cin>>n;
if(n==0)
cout<<1;
else
{
while(n)
{
int a = n % 16;n/=16;
if(a==0||a==4||a==6||a==9||a==10||a==13)
ans++;
if(a==8||a==11)
ans+=2;
}
cout<<ans;
}
return 0;
}
任意进制转十进制
转换流程
1.先将要转换的字符串 翻转
2.取出每一位 字符,将其转化成 整型,然后 乘上 本身进制的 i 次方
3.累加
#include<bits/stdc++.h>
using namespace std;
long long ans,x;
string s;
int main()
{
cin>>s;
reverse(s.begin(),s.end());
for(int i = 0 ; i < s.size();i ++)
{
if(s[i]<='9')
x = s[i] - '0';
else
x = s[i] - 'A' + 10;
ans+=pow(16,i)*x;
}
cout<<ans;
return 0;
}
经典习题
三十六进制
第八届蓝桥杯C语言B组国赛
对于16进制,我们使用字母A-F来表示10及以上的数字。
如法炮制,一直用到字母Z,就可以表示36进制。
36进制中,A表示10,Z表示35,AA表示370
你能算出 MANY 表示的数字用10进制表示是多少吗?
题解部分:
直接套用上面模板即可
#include<bits/stdc++.h>
using namespace std;
long long ans,x;
string s;
int main()
{
cin>>s;
reverse(s.begin(),s.end());
for(int i = 0 ; i < s.size();i ++)
{
if(s[i]<='9')
x = s[i] - '0';
else
x = s[i] - 'A' + 10;
ans+=pow(36,i)*x;
}
cout<<ans;
return 0;
}
答案:1040254
进制转换
今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 :
12 ^ 4+02^ 3+12^ 2+02 ^ 1+1*2^0,
那么请你编程实现,将一个M进制的数N转换成十进制表示的式子。
注意:当系数为0时,该单项式要省略。
输入格式
两个数,M和N,中间用空格隔开。
输出格式
共一行,一个十进制表示的式子。
输入 #1
2 10101
输出 #1
1*2^4+1*2^2+1*2^0
对于100%的数据,1<M<10,N的位数不超过1000。
坑点 :’+’
正常输出的话,无论怎样最后都会多出一个 ‘ + ‘
所以换个思考方式 : 先 判断 要不要打印 ‘+’ ,
如果是 第一个 或者 当下一位数 为 0 就不需要。
这样就不用考虑最后会多输出一个加号了,因为我们是先判断要不要加号,再计算的。
#include<bits/stdc++.h>
using namespace std;
string s;
int main()
{
int n;
cin>>n>>s;
for(int i = 0 ; i < s.size(); i ++)
{
int x = s[i] - '0';
if(i&&x)
cout<<'+';
if(x)
cout<<x<<'*'<<n<<'^'<<s.size()-1-i;
}
return 0;
}