• 【蓝桥杯/基础练习】十六进制转八进制


    题目

    问题描述
      给定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存储二进制后再次使用时忘记清除,在每轮开始前进行初始化即可

  • 相关阅读:
    SuffixArray
    CodeForces722C
    CodeForces1000C
    浅谈定积分
    浅谈线段树
    飞行员配对方案问题
    FhqTreap的区间翻转
    NOI2004郁闷的出纳员
    二分图匹配
    Far Relative’s Problem (贪心 计算来的最多客人)
  • 原文地址:https://www.cnblogs.com/wwj321/p/12320412.html
Copyright © 2020-2023  润新知