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