编写C语言程序进行进制转换的问题实例
题目
题目描述:
将M进制的数X转换为N进制的数输出。
输入:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出:
输出X的N进制表示的数。
样例输入:
1610
F
样例输出:
15
提示:
输入时字母部分为大写,输出时为小写,并且有大数据。
思路
大整数乘法转换成10进制数组
大整数除法转换成指定进制数
AC代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineLEN2000
charstr[LEN],another[LEN];
intten[LEN];
intswitchToTen();
voidswitchToAnother(intk,intn);
intmain()
{
intm,n,k;
while(scanf("%d%d",&m,&n)!=EOF){
scanf("%s",str);
k=switchToTen(m);
switchToAnother(k,n);
}
return0;
}
intswitchToTen(intm)
{
inti,j,len,k,c;
//初始化
len=strlen(str);
k=1;
memset(ten,0,sizeof(ten));
//转换为10进制数
for(i=0;i<len;i++){
for(j=0;j<k;j++){
ten[j]*=m;
}
if(str[i]>='0'&&str[i]<='9'){
ten[0]+=str[i]-'0';
}elseif(str[i]>='A'&&str[i]<='Z'){
ten[0]+=str[i]-'A'+10;
}elseif(str[i]>='a'&&str[i]<='z'){
ten[0]+=str[i]-'a'+10;
}
for(j=c=0;j<k;j++){
ten[j]+=c;
if(ten[j]>=10){
c=ten[j]/10;
ten[j]%=10;
}else{
c=0;
}
}
while(c){
ten[k++]=c%10;
c/=10;
}
}
//翻转数组
inttemp;
for(i=0,j=k-1;i<j;i++,j--){
temp=ten[i];
ten[i]=ten[j];
ten[j]=temp;
}
returnk;
}
voidswitchToAnother(intk,intn)
{
intsum,i,r,t,d;
sum=1;
r=0;
memset(another,0,sizeof(another));
while(sum){
sum=0;
for(i=0;i<k;i++){
d=ten[i]/n;
sum+=d;
if(i==k-1){
t=ten[i]%n;
if(t>=0&&t<=9){
another[r]=t+'0';
}else{
another[r]=t-10+'a';
}
r++;
}else{
ten[i+1]+=ten[i]%n*10;
}
ten[i]=d;
}
}
//打印是输出
for(i=r-1;i>=0;i--){
printf("%c",another[i]);
}
printf("\n");
}
/**************************************************************
Problem:1080
User:wangzhengyi
Language:C
Result:Accepted
Time:170ms
Memory:920kb
****************************************************************/
下面附上一个二进制、八进制、十进制、十六进制互相转化的C语言程序(有点长,嗯,看在功能n合一的份儿上XD)~
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
voidD_B(int);
voidD_O(int);
voidD_X(int);
voidB_D(int);
voidB_O(int);
voidB_X(int);
voidO_B(int);
voidO_D(int);
voidO_X(int);
voidX_B(charr[],intk);
voidX_D(charr[],intk);
voidX_O(charr[],intk);
voidmain()
{
inti,j,k=0;
intq;
charr[10];
printf("+=============================================================+\n");
printf("|欢迎使用进制转换程序|\n");
printf("+=============================================================+\n");
printf("注:本版本只做正整数的进制转换!!");
do
{
q=0;
//fflush(stdin);
printf("\n请选择需要被转换的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");
scanf("%d",&i);
switch(i)
{
case1:printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");
scanf("%d",&j);
switch(j)
{
case1:printf("\n同进制之间不用转化!\n");
q=1;
break;
case2:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
B_O(k);
q=1;
break;
case3:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
B_D(k);
q=1;
break;
case4:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
B_X(k);
q=1;
break;
case0:
printf("谢谢使用!!");
}
break;
case2:printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");
scanf("%d",&j);
switch(j)
{
case2:printf("\n同进制之间不用转化!\n");
q=1;
break;
case1:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
O_B(k);
q=1;
break;
case3:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
O_D(k);
q=1;
break;
case4:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
O_X(k);
q=1;
break;
case0:
printf("谢谢使用!!");
}
break;
case3:printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");
scanf("%d",&j);
switch(j)
{
case3:printf("\n同进制之间不用转化!\n");
q=1;
break;
case1:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
D_B(k);
q=1;
break;
case2:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
D_O(k);
q=1;
break;
case4:printf("\n请输入您想要转化的数:");
scanf("%d",&k);
D_X(k);
q=1;
break;
case0:
printf("谢谢使用!!");
}
break;
case4:printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");
scanf("%d",&j);
switch(j)
{
case4:printf("\n同进制之间不用转化!\n");
q=1;
break;
case1:printf("\n请输入您想要转化的数:");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_B(r,k);
q=1;
break;
case2:printf("\n请输入您想要转化的数:");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_O(r,k);
q=1;
break;
case3:printf("\n请输入您想要转化的数:");
fflush(stdin);
gets(r);
for(k=0;;k++)
{
if(r[k]=='\0')
break;
}
X_D(r,k);
q=1;
break;
case0:
printf("谢谢使用!!");
}
break;
case0:printf("\n谢谢使用!\n");
}
}while(q==1);
}
///////以下为:二进制转换为十进制,八进制,十六进制.
voidB_D(inta)
{
inti,s=0;
intresult=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
printf("\n转换后的数为:%d\n",result);
}
voidB_O(inta)
{
inti,j,k,s=0;
intp[30];
intresult=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%8;
result=result/8;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
voidB_X(inta)
{
inti,j,k,s=0;
charp[30];
intresult=0;
for(i=1;a!=0;i*=2)
{
if(a%10>1)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%16;
result=result/16;
if(p[j]>10)
{
switch(p[j])
{
case10:p[j]='A';
break;
case11:p[j]='B';
break;
case12:p[j]='C';
break;
case13:p[j]='D';
break;
case14:p[j]='E';
break;
case15:p[j]='F';
break;
}
}
elsep[j]+=48;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}
}
///////以下为:八进制转换为二进制,十进制,十六进制.
voidO_B(inta)
{
inti,j,k,s=0;
intresult=0;
intp[30];
for(i=1;a!=0;i*=8)
{if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%2;
result=result/2;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
voidO_D(inta)
{
inti,s=0;
intresult=0;
for(i=1;a!=0;i*=8)
{
if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:%d\n",result);
}
}
voidO_X(inta)
{
inti,j,k,s=0;
charp[30];
intresult=0;
for(i=1;a!=0;i*=8)
{
if(a%10>7)
{
s=1;
break;
}
else
{
result+=(a%10)*i;
a=a/10;
}
}
for(j=0;result!=0;j++)
{
p[j]=result%16;
result=result/16;
if(p[j]<10)
p[j]+=48;
else
{
switch(p[j])
{
case10:p[j]='A';
break;
case11:p[j]='B';
break;
case12:p[j]='C';
break;
case13:p[j]='D';
break;
case14:p[j]='E';
break;
case15:p[j]='F';
break;
}
}
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}
}
///////以下为:十六进制转换为十进制,二进制,八进制.
voidX_D(chara[],intk)
{
inti,j,s=0;
intresult=0;
intb[50];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
{b[i]=a[i]-48;
}
else
{
switch(a[i])
{
case'A':b[i]=10;
break;
case'B':b[i]=11;
break;
case'C':b[i]=12;
break;
case'D':b[i]=13;
break;
case'E':b[i]=14;
break;
case'F':b[i]=15;
break;
case'a':b[i]=10;
break;
case'b':b[i]=11;
break;
case'c':b[i]=12;
break;
case'd':b[i]=13;
break;
case'e':b[i]=14;
break;
case'f':b[i]=15;
break;
default:s=1;
}
}
}
for(i=1,j=k-1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:%d",result);
}
}
voidX_B(chara[],intk)
{
inti,j,s=0;
intresult=0;
intb[50];
intp[30];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
b[i]=a[i]-48;
else
{
switch(a[i])
{
case'A':b[i]=10;
break;
case'B':b[i]=11;
break;
case'C':b[i]=12;
break;
case'D':b[i]=13;
break;
case'E':b[i]=14;
break;
case'F':b[i]=15;
break;
case'a':b[i]=10;
break;
case'b':b[i]=11;
break;
case'c':b[i]=12;
break;
case'd':b[i]=13;
break;
case'e':b[i]=14;
break;
case'f':b[i]=15;
break;
default:s=1;
}
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
for(j=0;result!=0;j++)
{
p[j]=result%2;
result=result/2;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
voidX_O(chara[],intk)
{
inti,j,s=0;
intresult=0;
intb[30];
intp[30];
for(i=0;i<k;i++)
{
if(a[i]<='9'&&a[i]>='1')
b[i]=a[i]-48;
else
{
switch(a[i])
{
case'A':b[i]=10;
break;
case'B':b[i]=11;
break;
case'C':b[i]=12;
break;
case'D':b[i]=13;
break;
case'E':b[i]=14;
break;
case'F':b[i]=15;
break;
case'a':b[i]=10;
break;
case'b':b[i]=11;
break;
case'c':b[i]=12;
break;
case'd':b[i]=13;
break;
case'e':b[i]=14;
break;
case'f':b[i]=15;
break;
default:s=1;
}
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b[j]*i;
}
for(j=0;result!=0;j++)
{
p[j]=result%8;
result=result/8;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
}
///////以下为:十进制转换为二进制,八进制,十六进制.
voidD_B(inta)
{
intj,k;
intp[30];
for(j=0;a!=0;j++)
{
p[j]=a%2;
a=a/2;
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
voidD_O(inta)
{
intj,k;
intp[30];
for(j=0;a!=0;j++)
{
p[j]=a%8;
a=a/8;
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p[k]);
}
printf("\n");
}
voidD_X(inta)
{
intj,k;
intp[30];
for(j=0;a!=0;j++)
{
p[j]=a%16;
a=a/16;
if(p[j]<10)
p[j]+=48;
else
{
switch(p[j])
{
case10:p[j]='A';
break;
case11:p[j]='B';
break;
case12:p[j]='C';
break;
case13:p[j]='D';
break;
case14:p[j]='E';
break;
case15:p[j]='F';
break;
}
}
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%c",p[k]);
}
printf("\n");
}