각종 진 변환

오늘 야후 의 면접 문 제 를 보 았 습 니 다. 진법 전환 문제 이 고 printf () 가 가지 고 있 는 함수 라 이브 러 리 로 풀 수 없 기 때문에 불 시의 수요 에 대비 하여 정리 하 겠 습 니 다.
10 진 을 다른 진 으로 변환: (10 진 을 다른 진 으로 변환 하면 printf 함수 로 직접 변환 할 수 있 습 니 다.    라 이브 러 리 함수 사용:http://blog.csdn.net/u014665013/article/details/40213033)
(1) 10 진법 이 8 진법 으로 바뀐다.
라 이브 러 리 함수 사용
 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) 10 진법 16 진법
라 이브 러 리 함수 사용
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;
}

(2) 기타 진법 10 진법
(1) 8 진법 10 진법:
#include <iostream>
#include <cstdio>
using namespace std;

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

(2) 16 진법 에서 10 진법 으로 전환 (위 와 동일)
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
  long long t;
  while (scanf("%I64x", &t) != EOF)   //note:use %I64
    printf("%I64d
", 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;
}

주: 이 코드 가 정확 하지 않 습 니 다. 패스 가 없 는 테스트 데이터 가 있 습 니 다. 왜 요???   
(3) 다른 진법 이 다른 진법 으로 바 뀌 었 다.
(1) 16 진법 이 8 진법 으로 바 뀌 었 다 (데이터 가 비교적 작다) (16 진법 - > 10 진법 - > 8 진법)
<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>

데이터 가 비교적 클 때 16 진법 - > 2 진법 - > 8 진법 이 필요 하 다.
코드:
#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("
"); } return 0; }

이 문 제 를 풀 때 문 제 를 제출 한 적 이 있다 (+ 연산 자
http://blog.csdn.net/u014665013/article/details/43031619
(2) 8 진법 이 16 진법 으로 전환 (동상)
 


좋은 웹페이지 즐겨찾기