编写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"); }