//大数处理之进制转换 //http://ac.jobdu.com/problem.php cid=1040&pid=61 #include<stdio.h> #include<string.h> #define MAXS 3000 typedef struct E{ int num[MAXS];//num[0]放个位,依次往右排。 int quan; int lenth; }E; E spa;//这在main函数中,被置空。目的是为了置空其他大数的时候,可以直接令其=spa,省些事。 int stack[MAXS]; int count; E mul(int k,E x)//返回整数k与大数x的乘积 { int l=x.lenth,i; for(i=0;i<=l;i++)x.num[i]*=k; for(i=0;i<=l;i++) { x.num[i+2]+=x.num[i]/100; x.num[i+1]+=x.num[i]/10%10; x.num[i]%=10; } for(x.lenth+=2;x.num[x.lenth]==0;x.lenth--); return x; } E add(E x,E y)//返回大数x与大数y的和。 { int i; if(x.lenth<y.lenth){E temp=x;x=y;y=temp;} for(i=0;i<=y.lenth;i++) { x.num[i]+=y.num[i]; } for(i=0;i<=x.lenth;i++) { x.num[i+1]+=x.num[i]/10; x.num[i]%=10; } for(x.lenth+=2;x.num[x.lenth]==0;x.lenth--); return x; } E changeten(E sorce)//函数作用:处理ak这个大数与n这个整形数的乘积。 { E quan=spa,temp,ten=spa; int i; quan.num[0]=sorce.quan%10; if(sorce.quan>=10) { quan.num =sorce.quan/10; quan.lenth=1; } ten.num[0]=sorce.num[0]%10; ten.num =sorce.num[0]/10; ten.lenth=(ten.num !=0); for(i=1;i<=sorce.lenth;i++) { temp=mul(sorce.num[i],quan); ten=add(ten,temp); quan=mul(sorce.quan,quan); } return ten; } void divv(E sorce,int k) { int i; count=0; while(sorce.lenth) { for(i=sorce.lenth;i;i--) { sorce.num[i-1]+=(sorce.num[i]%k)*10;//标记一下……回头试一下,是不是把这里的10改成sorce的权值,就可以直接不用转化成10进制再求了? sorce.num[i]/=k; } stack[count++]=sorce.num[0]%k; sorce.num[0]/=k; for(;sorce.num[sorce.lenth]==0&&sorce.lenth;sorce.lenth--); } while(sorce.num[0]) { stack[count++]=sorce.num[0]%k; sorce.num[0]/=k; } } int main() { int i,j,l,b_quan; char ha[MAXS]; for(i=spa.lenth=0;i<MAXS;i++)spa.num[i]=0; E a=spa,ten=spa; while(~scanf("%d",&a.quan)) { scanf("%d",&b_quan); scanf("%s",ha); a.lenth=l=strlen(ha)-1; if(l==0&&ha[0]=='0'){printf("0\n");continue;} for(i=0,j=l;i<j;i++,j--){char tempc=ha[i];ha[i]=ha[j];ha[j]=tempc;} for(i=0;i<=l;i++) { if(ha[i]<='9'&&ha[i]>='0')a.num[i]=ha[i]-'0'; else a.num[i]=ha[i]-'A'+10; } n(a); divv(ten,b_quan); for(i=count-1;i>=0;i--) { if(stack[i]<10)printf("%d",stack[i]); else printf("%c",stack[i]-10+'a'); } printf("\n"); } return 0; } |