题目: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<cstring> #include<cstdio> #define LL __int64 #define N 15000 #define M 50005 #define MOD 1000000000 //模 #define wei 9 //压的位数 using namespace std; LL a[N],b[N],ans[N]; char c[M],d[M]; /*************存储处理部分******************/ int StrToNum(char t[],LL tt[]) //返回存储长度 { int len=0,t_len=strlen(t); int i,cnt=1; LL d=1,temp=0; for(i=t_len-1;i>=0;i--) { temp+=(t[i]-'0')*d; if(cnt==wei) { tt[len++]=temp; temp=0; cnt=d=1; } else { cnt++; d=d*10; } } tt[len++] = temp; //for(i=0; i<len; i++) // printf("%I64d ", tt[i]); //cout<<endl; return len; } /************************************/ /************乘法部分*************/ void mult(char c[],char d[]) { int a_len,b_len,i,j; LL flag,temp; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(ans, 0, sizeof(ans)); a_len= StrToNum(c, a); b_len= StrToNum(d, b); for(i=0;i<a_len;i++) { flag=0; for(j=0;j<b_len;j++) { temp=ans[i+j]+a[i]*b[j]+flag; // printf("%I64d ", temp); ans[i+j]=temp%MOD; flag=temp/MOD; } while(flag) { temp = ans[i+j]+ flag; ans[i+j]=temp%MOD; flag=temp/MOD; } } /***********************************/ /***********输出部分**************/ a_len=a_len+b_len+2; while(!ans[a_len]&&a_len>0)a_len--; if(a_len>=0) printf("%I64d", ans[a_len--]); while(a_len>=0) printf("%09I64d", ans[a_len--]); printf(" "); /*********注意输出格式的控制***************/ } /**************************************/ /************主函数部分***************/ int main() { while(scanf("%s%s",c,d)!=EOF) { mult(c,d); } return 0; } /**************************************/