十六进制数转八进制 大数转化

题目:

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274

思路: 先转化为2进制,然后再转化为八进制。

数学上容易证明,2进制和十六进制的转化就是美4位取一为一组。 转化为8进制就是每3位取为一组。

由于4*n=n(mod3),所以要对length对3的余数进行讨论。


代码:

#include<iostream>
#include<vector>
#include<string>
using namespace   std;


int getDigit(char c)
{
    if(c=='0')  return 0;
    
    else if(c=='1')  return 1;
  
    else if(c=='2')  return 2;
   
    else if(c=='3')  return 3;
   
    else if(c=='4')  return 4;
   
    else if(c=='5')  return 5;
   
    else if(c=='6')  return 6;
 
    else if(c=='7')  return 7;
    
    else if(c=='8')  return 8;
    
    else if(c=='9')  return 9;
 
    else if(c=='A')  return 10;
    
    else if(c=='B')  return 11;
    
    else if(c=='C')  return 12;
    
    else if(c=='D')  return 13;
    
    else if(c=='E')  return 14;
    
    else if(c=='F')  return 15;

    return -1;

    
}

int p[100000];
int q[400000];
int r[100000];

int g[3]={1,2,4};


int main()
{
    int n;
    cin>>n;
    
    string s;
    while(n--)
    {
        cin>>s;
        
        int length=s.length();
        {
            
            for(int i=0;i<length;i++)
                p[i]=getDigit(s[i]);
            for(int i=0;i<length;i++)
            {
                for(int j=3;j>=0;j--)
                {
                    q[4*i+j]=p[i]%2;
                    p[i]/=2;
                }
            }
            
//            for(int i=0;i<4*length;i++)
//                cout<<q[i]<<" ";
//            cout<<endl;
//            
            
           if(length%3==0)
           {
               bool flag=0;
               
               for(int i=0;i<4*length;i+=3)
              {
                  int temp=0;
                  for(int j=2;j>=0;j--)
                  {
                      temp+=g[j]*q[i+2-j];
                     
                  }
                   if(flag==0&&temp)
                   {   cout<<temp;
                       flag=1;
                   }
                  
                   else cout<<temp;
                  
              }
               cout<<endl;
           }
           else if(length%3==1)
           {
               bool flag=0;
               
               if(q[0])
               {
                   cout<<q[0];
                   flag=1;
                   
               }
               for(int i=1;i<4*length;i+=3)
               {
                   int temp=0;
                   for(int j=2;j>=0;j--)
                   {
                       temp+=g[j]*q[i+2-j];
                       
                   }
                   if(flag==0&&temp)
                   {   cout<<temp;
                       flag=1;
                   }
                   
                   else cout<<temp;
                   
               }
               cout<<endl;
           }
           else if(length%3==2)
               
           {
               
               bool flag=0;
               
               if(q[0]*2+q[1])
               {
                   cout<<q[0]*2+q[1];
                   flag=1;
                   
               }
               for(int i=2;i<4*length;i+=3)
               {
                   int temp=0;
                   for(int j=2;j>=0;j--)
                   {
                       temp+=g[j]*q[i+2-j];
                       
                   }
                   if(flag==0&&temp)
                   {   cout<<temp;
                       flag=1;
                   }
                   
                   else cout<<temp;
                   
               }
               cout<<endl;
               
           }
           
           
        }
        
    }
    
}


posted on 2014-03-05 01:53  814jingqi的ACM  阅读(506)  评论(0编辑  收藏  举报