进制转换有以下几类:
其他进制转化为十进制
eg : (16进制转换为10进制)
1234(16) = 1*16^3 + 2*16^2 + 3*16^1 + 4*16^0 = 4630(10)
eg:(8进制转换为10进制)
1234(8) = 1*8^3 + 2*8^2 + 3*8^1 + 4*8^0 = ……(10)
eg:(n进制转换为10进制)
1234(n) = 1*n^3 + 2*n^2 + 3*n^1 + 4*n^0 = ……(10)
例题一:HDU 1720 题目链接:链接
解决方法:
方法一:
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%x%x",&a,&b)!=EOF){//从输入格式下手,简单易懂
printf("%d\n",a+b);//%x,%X是: 读入十六进制整数 , %o,%O是: 读入八进制整数
}
return 0;
}
方法二:
#include<stdio.h>
#include<string.h>
int work(char *x)
{
int len,i,sum=0;
len=strlen(x);
for(i=0;i<len;i++)
{
if( '0'<=x[i] && x[i]<='9' )
sum=sum*16+x[i]-'0';//如果是想将任意进制数转换为十进制数,直接定义一个n代替16,其他不变
if( 'a'<=x[i] && x[i]<='f' ) sum=sum*16+x[i]-'a'+10;
if( 'A'<=x[i] && x[i]<='F' ) sum=sum*16+x[i]-'A'+10;
}
return sum;
}
int main()
{
char a[1000],b[1000];
while(~scanf("%s %s",a,b))
printf("%d\n",work(a)+work(b));
}
十进制数转化为其他小于十的进制
例题二:HDU 1877 链接
#include<stdio.h>
void randomjinzhi(int n,int a)//将十进制数转化为任意进制数
{
int i,j,count=0,t[10000];//int flag;
for( i=1; i<10000; i++ )
{
//方法一:
count++;
if( a<n )//处理最后一位数字,即输出结果数的最高位数
{
t[i] = a%n;
break;
}
t[i] = a%n;
a = a/n;
/*方法二:
count++;
flag=a%n;
t[i]=flag;
a/=n;
if(a==0)
break;
*/
}
for(j=count;j>0;j--)
printf("%d",t[j]);
}
int main()
{
int n,a,b,s=0;
while(~scanf("%d",&n) && 1<n && n<10)
{
if(n==0)
break;
scanf("%d%d",&a,&b);
s = a+b;
randomjinzhi(n,s);
printf("\n");
}
return 0;
}
十六进制数转化为十进制
例题三:hdu 2057 链接
方法一:
#include<stdio.h>
int main()
{
long long a,b;
while(scanf("%llX%llX",&a,&b)!=EOF)
{
if(a+b>=0)
printf("%llX\n",a+b);
else
printf("-%llX\n",-(a+b));
}
return 0;
}
方法二:
//对十六进制求和
//十六进制转化为十进制,十进制再转化为十六进制
#include<stdio.h>
#include<string.h>
long long shi(char *a)
{
long long i,s,length;
length = strlen(a);
s=0;
for( i=0; i<length; i++)
{
if( a[i]>='0' && a[i]<='9' ) s=s*16+a[i]-'0';
if( a[i]>='a' && a[i]<='f' ) s=s*16+a[i]-'a'+10;
if( a[i]>='A' && a[i]<='F' ) s=s*16+a[i]-'A'+10;
}
return s;
}
void shiliu(long long a)
{
char t[10000],liu[17]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
long long count=0,A,i;
for( i=1; i<=10000; i++)
{
A=a%16;
t[count]=liu[A];
a=a/16;
if(a == 0) break;
count++;
}
for( i=count; i>=0; i--)
printf("%c",t[i]);
}
int main()
{
char a[20],b[20];
long long s = 0,A,B;
while(~scanf("%s%s",&a,&b))
{
A=0;B=0;
if(a[0] !='-' && b[0]!='-')
s = shi(a) + shi(b);
else
{
if(a[0] == '-')
A=-shi(a);
else
A=shi(a);
if( b[0]=='-')
B=-shi(b);
else
B=shi(b);
s = A+B;
}
if(s<0)
{
printf("-");
shiliu(-s);
}
else
shiliu(s);
printf("\n");
}
return 0;
}
十六进制转换为八进制
例题四:蓝桥杯 BASIC-2 链接
方法:
#include <iostream>
#include <cstring>
using namespace std;
int T[1000010]={0};
int b1[1000010];
int main()
{
char t[17][5] =
{
"0000",
"0001","0010","0011","0100",
"0101","0110","0111","1000",
"1001","1010","1011","1100",
"1101","1110","1111"
};
string a;
int N;
cin >> N;
while(N--)
{
cin >> a;
int cnt=0,cnt1=0;
int n,n1;
int s = 0;
//将十六进制数转换为二进制存储在一个整型数组中
for( int i=0; i<a.length(); i++ )
{
if( a[i]>='0' && a[i]<='9' )
n = a[i]-'0';
if( a[i]>='A' && a[i]<='F' )
n = a[i]-'A'+10;
for( int j = 0; j<4; j++ )
T[cnt++] = t[n][j]-'0';
}
for( int i=cnt-1; i>=0; i-=3 )
{
b1[cnt1++]=T[i]*1+T[i-1]*2+T[i-2]*4;
}
for( int i=cnt1-1; i>=0; i-- )
{
if( i == cnt1-1 && b1[i] == 0 )
continue;
cout<<b1[i];
}
cout << endl;
}
return 0;
}
拓展:
万进制
void wfac(int n)
{
int a[10002];
int i,j,carry,place=0;
a[1] = 1;
for(i = 1;i <= n;i++)
{
carry = 0;
for(j = 0;j <= place;j++)
{
a[j] = a[j] * i + carry;
carry = a[j]/10000;
a[j] %= 10000;
}
if(carry > 0)
{
place++;
a[place] = carry;
}
}
printf("%d",a[place]);
for(i = place-1;i >= 0;i--)
printf("%04d",a[i]);
}
例题五:hdu-1002 链接