62进制(非大数除法实现)

 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  }

 

posted @ 2012-08-22 14:35  疼痛落在指尖  阅读(287)  评论(0编辑  收藏  举报