蓝桥杯进制类模板

简介: 蓝桥杯进制类模板

前言


唤我沈七就好啦。


往期系列文章


蓝桥杯日期类模板


十进制转任意进制


20.png


转换流程


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; 
 }


任意进制转十进制


21.png


转换流程


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;
}


打印 36 进制的 九九乘法表


22.png



#include<bits/stdc++.h>
using namespace std;
string fun(int x)
{
  string s;
  while(x)
  {
  int a = x % 36;x/=36; 
  if(a< 10)
  s += a + '0';
  else
  s += a - 10 + 'A';
  }
  reverse(s.begin(),s.end());
  return s; 
}
int main()
{
  for(int i = 1 ; i <= 9 ; i ++)
  {
  for(int j = 1 ; j <= i ; j ++)
  {
  printf("%d*%d=",i,j);  
  cout<<fun(i*j)<<"  ";
  }
  puts("");
  }
  return 0;
}


完结散花


ok以上就是对 蓝桥杯进制类模板 的全部讲解啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。


参考文献


https://www.acwing.com/activity/content/19/


相关文章
|
6月前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
56 4
|
6月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
52 3
|
6月前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
58 2
|
6月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
40 1
|
6月前
|
Java
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
47 1
|
6月前
|
Java
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
36 0
2021蓝桥杯大赛软件类省赛Java大学B组 时间显示
|
6月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
40 0
|
6月前
|
Java
2020蓝桥杯大赛软件类省赛Java大学B组 寻找2020
2020蓝桥杯大赛软件类省赛Java大学B组 寻找2020
35 0
|
6月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
61 0
|
6月前
2022蓝桥杯大赛软件类国赛真题 卡牌
2022蓝桥杯大赛软件类国赛真题 卡牌
30 0