Sweety

Practice makes perfect

导航

各种进制转换

Posted on 2015-01-23 01:23  蓝空  阅读(202)  评论(0编辑  收藏  举报

今天看到雅虎一道面试题,竟然是一道进制转换的题,并且还不允许用printf()自带的函数库来做,所以就整理一下,以备不时之需;

十进制转换为其他进制:(十进制转换为其他进制可使用printf函数直接转换    库函数使用:http://blog.csdn.net/u014665013/article/details/40213033

(1)十进制转化为八进制

使用库函数

 int main()
{ 
 int n;
 scanf("%d",&n);
 printf("%O",n);
return 0;
}

自己代码:(递归方法)

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
 string str="";
string fun(int n)
{
	if(n==0)  //注意特殊情况,本题要求非负数 
	return "0";
	if(n>0)
	 {
	  int x=n%8;
	  fun(n/8);
	  str=str+char(x+'0');
	 } 
	 return str;
}
int main()
{ 
 int n;
 scanf("%d",&n);
cout<< fun(n);
return 0;
}

 

(2)十进制转十六进制

使用库函数

int main()
{ 
 int n;
 scanf("%d",&n);
 printf("%X",n);
return 0;
}

自己代码:

采用的递归方法

 

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
 string str="";
char exchenge(int n)
{
	if(n<10)
	  return n+'0';
	if(n==10)
	  return 'A';
	if(n==11)
	  return 'B';
	if(n==12)
	  return 'C';
	if(n==13)
	  return 'D';
	if(n==14)
	  return 'E';
	if(n==15)
	  return 'F';
}

string fun(int n)
{
	if(n==0)  //注意特殊情况,本题要求非负数 
	return "0";
	if(n>0)
	 {
	  int x=n%16;
	  fun(n/16);
	  str=str+exchenge(x);
	 } 
	 return str;
}

int main()
{ 
 int n;
 scanf("%d",&n);
cout<< fun(n);
return 0;
}


(二)其他进制转十进制

(1)八进制转十进制:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
  long long t;
  while (scanf("%I64o", &t) != EOF)   //note:use %I64
    printf("%I64d\n", t);
    return 0;
}

(2)十六进制转为十进制(与上同)

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
  long long t;
  while (scanf("%I64x", &t) != EOF)   //note:use %I64
    printf("%I64d\n", t);
    return 0;
}


自己代码:

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
 
int main()
{
char ch_16[10];
long long ch_10=0;
scanf("%s",ch_16);
int chlen=strlen(ch_16);
int i=0;
for(;i<chlen;i++)
 {
  if(ch_16[i]<='9'&&ch_16[i]>=0)
      ch_10=ch_10*16+ch_16[i]-'0';
  else 
  if(ch_16[i]>='A')
     ch_10=ch_10*16+ch_16[i]-'A'+10;
 }
 printf("%lld",ch_10);
return 0;
}

注:本代码不完全正确,有一组测试数据没有pass,为什么????? 
 


(三)其他进制转化为其他进制


(1)十六进制转化为八进制(数据比较小)(十六进制---->十进制---->八进制)

<span style="font-size:12px;">#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
 string str="";
string fun(int n)
{
	if(n==0)  //注意特殊情况,本题要求非负数 
	return "0";
	if(n>0)
	 {
	  int x=n%8;
	  fun(n/8);
	  str=str+char(x+'0');
	 } 
	 return str;
}
int _16To10(char ch){
    if(ch<='9'&&ch>='0')
 	 return int(ch-'0');
    if(ch>='A'&&ch<='F')
      return 10+ch-'A';
  
}
int main()
{ 
int Case;
scanf("%d",&Case);
while(Case--){
 char ch[100005];
 int n=0;
 cin>>ch;
 for(int i=0;i<strlen(ch);i++)
  n=n*16+_16To10(ch[i]);
cout<<fun(n)<<endl;
str=""; 
}
return 0;
}
</span>



数据较大时,需十六进制---->二进制------>八进制

代码:

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
char str[200005];
 
int main()
{	
 int Case;
scanf("%d",&Case);
while(Case--){
string str_16;
string str_2="";

 cin>>str_16;

 //修正位 
 int str_16len=str_16.length();
 if(str_16len%3==1)
  str_2="00"+str_2;
 if(str_16len%3==2)  
   str_2="0"+str_2; 

  
  //16进制转化为2进制 
 	
     for( int i=0;i<str_16len;i++)
    {
       if(str_16[i]=='0')
          str_2+="0000";
       else if(str_16[i]=='1')
          str_2+="0001";
       else if(str_16[i]=='2')
          str_2+="0010";
       else if(str_16[i]=='3')
           str_2+="0011";
       else if(str_16[i]=='4')
          str_2+="0100";
       else if(str_16[i]=='5')
          str_2+="0101";
       else if(str_16[i]=='6')
          str_2+="0110";
       else if(str_16[i]=='7')
          str_2+="0111";   
       else if(str_16[i]=='8')
          str_2+="1000";
       else if(str_16[i]=='9')
          str_2+="1001";
       else if(str_16[i]=='A')
          str_2+="1010";
       else if(str_16[i]=='B')
          str_2+="1011";
       else if(str_16[i]=='C')
          str_2+="1100";
       else if(str_16[i]=='D')
          str_2+="1101";
       else if(str_16[i]=='E')
          str_2+="1110";
       else if(str_16[i]=='F')
          str_2+="1111";
    }


   int bit=str_2.length() ,j;
    int i;
	for(i=0,j=0;i<=bit-3;i=i+3)
	{
	 str[j]=(str_2[i]-'0')*4+(str_2[i+1]-'0')*2+str_2[i+2]  ;
	 j++;
	}
	
     i=0;
	if(!(str[i]=='0'))
      printf("%c",str[i]);
	for(i=1;i<j;++i)
      printf("%c",str[i]);
     printf("\n");
}
return 0;
}
在做这道题的时候提交出过问题(+ 运算符),网址 http://blog.csdn.net/u014665013/article/details/43031619

(2)八进制转化为16进制(同上)