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


      基础练习 十六进制转八进制  
    时间限制:1.0s   内存限制:512.0MB
          
    问题描述
      给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

    样例输入
      2
      39
      123ABC

    样例输出
      71
      4435274

      提示
      先将十六进制数转换成某进制数,再由某进制数转换成八进制。
     
    先将十六进制数转换成二进制数,再由二进制数转换成八进制。
     
    我刚开始定义的char型字符数组 一直超时,看网上用的string定义的字符串就不超时,郁闷
    超时代码
    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<math.h>
    #include<algorithm>
    #define LL long long
    #define PI atan(1.0)*4
    #define DD doublea
    #define MAX 100100
    #define mod 10007
    using namespace std;
    char a[MAX];
    int p[MAX*10];
    int main()
    {
        int n,m,j,i,len,sum;
        scanf("%d",&n);
        while(n--)
        {   	
        	scanf("%s",&a);	
        	char s[MAX*10]="";
        	len=strlen(a);
        	for(i=0;i<len;i++)  //转化为二进制 
        	{
        	    switch(a[i])
        	    {
        	    	case '0':strcat(s,"0000");break;
        	    	case '1':strcat(s,"0001");break;
        	    	case '2':strcat(s,"0010");break;
        	    	case '3':strcat(s,"0011");break;
        	    	case '4':strcat(s,"0100");break;
        	    	case '5':strcat(s,"0101");break;
        	    	case '6':strcat(s,"0110");break;
        	    	case '7':strcat(s,"0111");break;
        	    	case '8':strcat(s,"1000");break;
        	    	case '9':strcat(s,"1001");break;
        	    	case 'A':strcat(s,"1010");break;
        	    	case 'B':strcat(s,"1011");break;
        	    	case 'C':strcat(s,"1100");break;
        	    	case 'D':strcat(s,"1101");break;
        	    	case 'E':strcat(s,"1110");break;
        	    	case 'F':strcat(s,"1111");break;
        	    	default:break;
        	    }
        	}
        	//puts(s);
        	strrev(s);
        	int len1=strlen(s);
        	if(len1%3==1) //因为二进制转八进制,是有三位二进制变为一位八进制 
        	{           //所以要补全,在前边补0使长度能整除3 
        		strcat(s,"00");
        		len1+=2;
        	}
        	else if(len1%3==2)
        	{
        		strcat(s,"0");
        		len1+=1;
        	}
        	int op=1;
        	for(i=0;i<len1-2;i+=3)  //二进制转八进制 
        	{
        		p[op++]=(s[i]-'0')*1+(s[i+1]-'0')*2+(s[i+2]-'0')*4;
        	}
        	int flag=1;
        	for(i=op;i>0;i--)
        	{
        		if(p[i]!=0)
        		    flag=0;
        		if(p[i]==0&&flag)
        		    continue;
        		printf("%d",p[i]);
        	} 
            printf("
    ");
        }
    	return 0;
    } 
    

      AC代码:

    #include<stdio.h>
    #include<string.h>
    #include<string>
    #include<math.h>
    #include<algorithm>
    #define LL long long
    #define PI atan(1.0)*4
    #define DD doublea
    #define MAX 100100
    #define mod 10007
    using namespace std;
    int p[MAX*10];
    int main()
    {
        int n,m,j,i,len,sum;
        scanf("%d",&n);
        while(n--)
        {
        	string a,s;
        	a.resize(MAX); //需要预先分配空间 
        	scanf("%s",&a[0]);
        	s="";
        	len=a.length();//字符串长度 
        	for(i=0;i<len;i++)
        	{
        	    switch(a[i])
        	    {
        	    	case '0':s+="0000";break;
        	    	case '1':s+="0001";break;
        	    	case '2':s+="0010";break;
        	    	case '3':s+="0011";break;
        	    	case '4':s+="0100";break;
        	    	case '5':s+="0101";break;
        	    	case '6':s+="0110";break;
        	    	case '7':s+="0111";break;
        	    	case '8':s+="1000";break;
        	    	case '9':s+="1001";break;
        	    	case 'A':s+="1010";break;
        	    	case 'B':s+="1011";break;
        	    	case 'C':s+="1100";break;
        	    	case 'D':s+="1101";break;
        	    	case 'E':s+="1110";break;
        	    	case 'F':s+="1111";break;
        	    	default:break;
        	    }
        	}
        	//puts(s);
        	//strrev(s);
        	int len1=s.length();
        	if(len1%3==1)
        	{
        		s="00"+s;  //00+s是将00加在字符串前  s+00是将00加在字符串后 
        		len1+=2;
        	}
        	else if(len1%3==2)
        	{
        		s="0"+s;
        		len1+=1;
        	}
        	int op=1;
        	for(i=0;i<len1-2;i+=3)
        	{
        		p[op++]=(s[i]-'0')*4+(s[i+1]-'0')*2+(s[i+2]-'0')*1;
        	}
        	int flag=1;
        	for(i=0;i<op;i++)
        	{
        		if(p[i]!=0)
        		    flag=0;
        		if(p[i]==0&&flag)
        		    continue;
        		printf("%d",p[i]);
        	} 
            printf("
    ");
        }
    	return 0;
    } 
    

      

  • 相关阅读:
    逻辑地址、线性地址、物理地址
    查找已知字符串子串
    替换字符串中的空格为%20
    资本的奥秘
    net::ERR_CONNECTION_RESET的处理方法
    SQL Server数据库从低版本向高版本复制数据库
    中式思维的五大逻辑缺陷(转)
    1年PK12年,中国式教育完败(转载)
    有关衣服的想法
    jquery邮箱自动补全
  • 原文地址:https://www.cnblogs.com/tonghao/p/5131319.html
Copyright © 2020-2023  润新知