您的位置:首页 > 其它

任意进制转换--(62进制)

2012-07-24 21:18 190 查看
题目: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)

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1005
using namespace std;

int StrToNum(char t)//字符--->>数字
{
if(t>='0'&&t<='9')return t-'0';//数字
if(t>='A'&&t<='Z')return t-'A'+10;//大写字母
else return t-'a'+36;//小写字母
}

char NumToStr(int t)//数字-->>>字符
{
if(t>=0&&t<=9)return (t+'0');
if(t>=10&&t<=35)return (t-10+'A');
else return (t-36+'a');
}

void conversion(int old_base,int new_base,char t[],int len)
{
int div
;//被除数
int ans
;//商
int res
;//余数
int i,j,temp_len=len,temp,k=0,m;
memset(div,0,sizeof(div));
memset(ans,0,sizeof(ans));
memset(res,0,sizeof(res));
for(i=0;i<len;i++)
div[i]=StrToNum(t[i]);
while(temp_len>=1)//只要被除数不等于(长度>=1),就继续
{
temp=0;//余数
j=0;
while(j<temp_len)
{
temp=temp*old_base+div[j];
ans[j]=temp/new_base;
temp%=new_base;
j++;
}
res[k++]=temp;
j=0;
while(j<temp_len&&ans[j]==0) j++; //去除前导零
memset(div,0,sizeof(div));
for(i=j,m=0;i<temp_len;i++)  //商变成新的被除数
div[m++]=ans[i];
temp_len=m;
memset(ans,0,sizeof(ans));//清空商
}
for(i=k-1;i>=0;i--)
cout<<NumToStr(res[i]);
cout<<endl;
}
int main()
{
int i,test,base_a,base_b,len;
char temp
;
cin>>test;
while(test--)
{
memset(temp,0,sizeof(temp));
scanf("%d%d%s",&base_a,&base_b,temp);
len=strlen(temp);
cout<<base_a<<" ";
for(i=0;i<len;i++)
cout<<temp[i];
cout<<endl;
cout<<base_b<<" ";
conversion(base_a,base_b,temp,len);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: