zoukankan      html  css  js  c++  java
  • 【蓝桥杯/基础练习】十六进制转八进制

    题目

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

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

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

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

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

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

    程序

    #include<iostream> 
    #include<string>
    using namespace std;
    int main()
    {
           //freopen("data.txt","r",stdin);        //此句用来测试  
    	string six,oct[10],bin;   //six存储每一个输入的十六进制,oct存储总的转换后的八进制,bin存储每一个中间二进制 
    	int n;
    	cin>>n;
    	int binlen=bin.size();
    	int flagbin=0;
    	for(int i=0;i<n;i++)
    	{
    		cin>>six;
    		bin.erase(0,binlen);          //每一轮使用bin存储二进制前先将其初始化
    		for(int j=0;j<six.size();j++)
    		{
    			switch(six[j]){                          //十六进制转二进制,比较直白粗暴的方法
    				case '0':bin+="0000";break;
    				case '1':bin+="0001";break;
    				case '2':bin+="0010";break;
    				case '3':bin+="0011";break;
    				case '4':bin+="0100";break;
    				case '5':bin+="0101";break;
    				case '6':bin+="0110";break;
    				case '7':bin+="0111";break;
    				case '8':bin+="1000";break;
    				case '9':bin+="1001";break;
    				case 'A':bin+="1010";break;
    				case 'B':bin+="1011";break;
    				case 'C':bin+="1100";break;
    				case 'D':bin+="1101";break;
    				case 'E':bin+="1110";break;
    				case 'F':bin+="1111";break;
    			}
    		}
    		binlen=bin.size();
    		flagbin=0;
    		int flagoct=0;
    		int lenth=0;
    		while(bin[flagbin]=='0')           //去除二进制前缀0
    		{
    			flagbin++;
    			binlen--;
    	       }
    	       if(flagbin!=0)
    			bin.erase(0,flagbin);
    		if(binlen%3==1)           //向3的倍数补齐,便于八进制转换
    		{
    			bin="00"+bin;
    		}
    		else if(binlen%3==2)
    		{
    			bin="0"+bin;
    		}
    		binlen=bin.size();
    		for(flagbin=0;flagbin<binlen;)         //将二进制转换为八进制
    		{
    			int tempnum; 
    			tempnum=(bin[flagbin++]-'0')*4+(bin[flagbin++]-'0')*2+(bin[flagbin++]-'0');
    			switch(tempnum){                //同暴力转换
    				case 0:oct[i]+='0' ;break;
    				case 1:oct[i]+='1' ;break;
    				case 2:oct[i]+='2' ;break;
    				case 3:oct[i]+='3' ;break;
    				case 4:oct[i]+='4' ;break;
    				case 5:oct[i]+='5' ;break;
    				case 6:oct[i]+='6' ;break;
    				case 7:oct[i]+='7' ;break;
    			}
    		}
    		
    	}
    	for(int p=0;p<n;p++)
    	{
    		cout<<oct[p]<<endl; 
    	}
    	return 0;
    }
    

    编写程序中出现过的错误

    1.八进制转换二进制时,忘了减‘0’
    减‘0’是为了将字符形式的数字转化为int型进行计算,计算出tempnum后再使用switch句型转化为字符形式的八进制。
    2.bin使用后忘记清空字符串
    即每轮输入使用bin存储二进制后再次使用时忘记清除,在每轮开始前进行初始化即可

  • 相关阅读:
    【Elasticsearch 技术分享】—— ES 常用名词及结构
    【Elasticsearch 技术分享】—— Elasticsearch ?倒排索引?这都是什么?
    除了读写锁,JUC 下面还有个 StampedLock!还不过来了解一下么?
    小伙伴想写个 IDEA 插件么?这些 API 了解一下!
    部署Microsoft.ReportViewe
    关于TFS强制undo他人check out
    几段查看数据库表占用硬盘空间的tsql
    How to perform validation on sumbit only
    TFS 2012 Disable Multiple Check-out
    在Chrome Console中加载jQuery
  • 原文地址:https://www.cnblogs.com/wwj321/p/12320412.html
Copyright © 2011-2022 走看看