任意进制转换--(62进制)
题目:62进制(非大数除法实现)
'0'-'9'-----0-9
A-Z-------10-35
a-z--------36-62
具体说明可以参考此博客
http://www.cppblog.com/kuangbin/archive/2011/08/25/154299.html?opt=admin
在此简短说一下:
例如 10进制的18 转换为2进制
被除数 除数 商 余数
1 8 / 2 ---------09 0 ---------- 1轮结束
9 / 2 -------- 4 1 --------- 2轮结束
4 / 2-------- 2 0 --------- 3轮结束
2 / 2 -------- 1 0 --------- 4轮结束
1 / 2 -------- 0 1 ---------- 5轮结束
0 -----------结束
二进制 10010(18)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 1005 5 using namespace std; 6 7 int StrToNum(char t)//字符--->>数字 8 { 9 if(t>='0'&&t<='9')return t-'0';//数字 10 if(t>='A'&&t<='Z')return t-'A'+10;//大写字母 11 else return t-'a'+36;//小写字母 12 } 13 14 char NumToStr(int t)//数字-->>>字符 15 { 16 if(t>=0&&t<=9)return (t+'0'); 17 if(t>=10&&t<=35)return (t-10+'A'); 18 else return (t-36+'a'); 19 } 20 21 void conversion(int old_base,int new_base,char t[],int len) 22 { 23 int div[N];//被除数 24 int ans[N];//商 25 int res[N];//余数 26 int i,j,temp_len=len,temp,k=0,m; 27 memset(div,0,sizeof(div)); 28 memset(ans,0,sizeof(ans)); 29 memset(res,0,sizeof(res)); 30 for(i=0;i<len;i++) 31 div[i]=StrToNum(t[i]); 32 while(temp_len>=1)//只要被除数不等于(长度>=1),就继续 33 { 34 temp=0;//余数 35 j=0; 36 while(j<temp_len) 37 { 38 temp=temp*old_base+div[j]; 39 ans[j]=temp/new_base; 40 temp%=new_base; 41 j++; 42 } 43 res[k++]=temp; 44 j=0; 45 while(j<temp_len&&ans[j]==0) j++; //去除前导零 46 memset(div,0,sizeof(div)); 47 for(i=j,m=0;i<temp_len;i++) //商变成新的被除数 48 div[m++]=ans[i]; 49 temp_len=m; 50 memset(ans,0,sizeof(ans));//清空商 51 } 52 for(i=k-1;i>=0;i--) 53 cout<<NumToStr(res[i]); 54 cout<<endl; 55 } 56 int main() 57 { 58 int i,test,base_a,base_b,len; 59 char temp[N]; 60 cin>>test; 61 while(test--) 62 { 63 memset(temp,0,sizeof(temp)); 64 scanf("%d%d%s",&base_a,&base_b,temp); 65 len=strlen(temp); 66 cout<<base_a<<" "; 67 for(i=0;i<len;i++) 68 cout<<temp[i]; 69 cout<<endl; 70 cout<<base_b<<" "; 71 conversion(base_a,base_b,temp,len); 72 } 73 return 0; 74 }