当前位置:   article > 正文

蓝桥杯——练习(2.24)

蓝桥杯——练习(2.24)

蓝桥杯——练习(2.24)

基础练习 十六进制转八进制

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T51

问题描述

给定n个十六进制正整数,输出它们对应的八进制数。

输入格式

输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式

输出n行,每行为输入对应的八进制正整数。

【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入

2
39
123ABC

样例输出

71
4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

解题思路

  • 将输入的十六进制数先转换为二进制数,然后再将二进制数据转换成八进制数,本题用到了string类,定义了两个变量s1,s2,s1用来存入需要读入的数据,s2初始化为空,将转换后的数据存放到s2中。

  • 遍历s1,将每一位十六进制数转换成二进制数,存放到s2中,string类型的字符串可以直接进行相加,从而将每一位都拼接到一起。

  • 转换完成后,利用length函数求得s2的长度,如果长度是3的倍数就不用处理,如果长度mod 3 =1,需要在s2的前两位加上‘00’来补充位数,如果余数为2,则需要加上‘0’。

  • 然后遍历s2,每三位一组,将二进制数据转为八进制数,定义一个flag作标记,用来忽略前导的0。

代码

#include<iostream>
#include<string>
using namespace std; 
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string s1,s2;
		cin>>s1;
		s2="";
		for(int i=0;i<s1.length();i++)
		{
			switch(s1[i])
			{
				case '0':s2+="0000";break;
				case '1':s2+="0001";break;
				case '2':s2+="0010";break;
				case '3':s2+="0011";break;
				case '4':s2+="0100";break;
				case '5':s2+="0101";break;
				case '6':s2+="0110";break;
				case '7':s2+="0111";break;
				case '8':s2+="1000";break;
				case '9':s2+="1001";break;
				case 'A':s2+="1010";break;
				case 'B':s2+="1011";break;
				case 'C':s2+="1100";break;
				case 'D':s2+="1101";break;
				case 'E':s2+="1110";break;
				case 'F':s2+="1111";break;
				default:break;
			}
		}
		int len=s2.length();
		if(len%3==1)
		{
			s2="00"+s2;
		}
		else if(len%3==2)
		{
			s2="0"+s2;
		}
		int flag=0;
		for(int i=0;i<=s2.length()-3;i+=3)
		{
			int l=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
			if(l)
				flag=1;
			if(flag)
				cout<<l;
		}
		cout<<endl;
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

视频学习——快速提升代码能力题解

视频链接:https://www.bilibili.com/video/BV1jE411g76D?p=6

学习心得

  • 通过对本视频的学习,学到了为什么要提升代码的能力,代码的能力就是将我们的思维转换成计算机能够识别的程序。
  • 要想真正提高代码的能力,多实践是必不可少的,通过大量的练习来提高对计算机的熟练度,从而在将我们的所思所想转换为机器能够识别的程序中取得进步。

题目练习 算法训练 二进制数数

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T536

问题描述

给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
如5的二进制为101,包含2个“1”。

输入格式

第一行包含2个数L,R

输出格式

一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。

样例输入

2 3

样例输出

3

数据规模和约定

L<=R<=100000;

代码

#include<iostream>
using namespace std;

int s=0;
int main()
{
	int L,R;
	cin>>L>>R;
	for(int i=L;i<=R;i++)
	{
		int number=i;
		while(number)
		{
			int x=number%2;
			number/=2;
			if(x==1)
			s++;
		}
	}
	cout<<s<<endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/929681
推荐阅读
相关标签
  

闽ICP备14008679号