一、进制转换
从m进制转换到n进制 : ①从m进制转换到十进制 ②从十进制转换到n进制
十进制转换到其他进制
x = b0* 2^0 +b1*2^1……
应用上章数位拆解的方法得到 b0,b1,b2:
x%2=b0
这样就得到了该数字由二进制表示时的最低数位。然后不断对x做整除,除2,同样可以将高位数字向低位移动
x/2 = b1*2^0 +b2*2^1……
将二进制数表示为十进制比较容易
题目一:
A+B
输入两个不超过整形定义的非负十进制整数,求和后,输出它的m进制数—–(十进制转化为其他进制)
两个int数字的和可能会超过int所能表达的最大数字,出现溢出,所以这里使用 long long
do{
ans[size++] = a%m;
a/=m;
}while(a!=0);
这里保证了,即使该整数是0,也能够进行转换
完整代码:
#include<stdio.h>
int main()
{
long long a,b;
int m;
while(scanf("%d",&m)!=EOF)
{
if(m==0) break;
scanf("%lld%lld",&a,&b);
a = a+b;
int ans[50],size = 0;
//保证转换工作至少执行一次,那么即使是0,程序也能正常工作
do{
ans[size++] = a%m;
a/=m;
}while(a!=0);
int i = size-1;
for(i = size-1;i>=0;i--)
{
printf("%d",ans[i]);
}
printf("\n");
}
return 0;
}
题目二:
数制转换: 由a进制转化为b进制
将a进制数字转化为10进制,并用tmp保存起来
int tmp,lenth = strlen(str),c=1;
int i,j;
for(i=lenth-1;i>=0;i--)
{
int x;
if(str[i]>='0' && str[i] <='9')
x = str[i] - '0';
else if(str[i]>='a' && str[i]<='z') //字符转化为整数
x = str[i]-'a'+10;
else
x = str[i]-'A'+10;
tmp +=x*c;
c*=a;
}
将十进制转化为b进制,并转化为字符串输出
char ans[40],size = 0;
do{
int num = tmp%b;
ans[size++] = (num<10) ? num+'0' : num-10+'A'; //数字转化为字符
tmp /=b;
}while(tmp!=0);
for(j=size-1;j>=0;j--){
printf("%c",ans[j]);
}
题目二:
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。(这里注意30)
大整数的进制转换
首先来看一个例子。
十进制的123456789 转为 二进制,注意这里要手工算。
//大整数除法,模拟除以2的过程,直到各个位都为0
int devide(int len)
{
int carray = 0;
for(int i=0;i<len;i++)
{
int num = ((carray*10)+srci[i])/2;
carray = srci[i]%2;
srci[i] = num;
}
return carray;
}
//判断srci是否为0
bool isZero(int len)
{
for (int i=len-1; i>=0; i--)
{
if (srci[i] != 0)
{
return false;
}
}
return true;
}
#include <stdio.h>
char str[200]={0};
int stri[200]={0};
char res[200]={0};
//大整数除法
int devide(int len)
{
int carray = 0;
int i;
for(i=0;i<len;i++)
{
int num = ((carray*10)+stri[i])/2;
carray = stri[i]%2;
stri[i] = num;
}
return carray;
}
//最后为0得情况
int isZero(int len)
{
int i;
for(i=len-1;i>=0;i--)
{
if(stri[i]!=0)
return 0;
}
return 1;
}
int main () {
while(scanf("%s",str)!=EOF)
{
int len = 0;
while(str[len]!=0)
{
stri[len] = str[len]-'0'; //字符转化为数字
len++;
}
int index=0;
do{
res[index++] = devide(len)+'0'; //数字转化为字符表示
}while(!isZero(len));
int i;
for(i=index-1;i>=0;i--)
{
printf("%c",res[i]);
}
printf("\n");
}
return 0;
}
题目三:
八进制
输入一个整数,将其转换成八进制数输出。
输入包括一个整数N(0<=N<=100000)。 (1024)
#include<stdio.h>
//输入一个整数N,输出其八进制表示
int ans[200] = {0};
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
int size=0;
do{
ans[size++] = N%8;
N/=8;
}while(N!=0);
int i=0;
for(i=size-1;i>=0;i--)
{
printf("%d",ans[i]);
}
printf("%\n");
}
return 0;
}