您的位置:首页 > 其它

九度OJ 教程62 大数处理之《进制转换》

2013-02-21 13:34 246 查看
题目地址:http://ac.jobdu.com/problem.php?cid=1040&pid=61

//九度OJ 教程62 大数处理之《进制转换》
//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[1]=sorce.quan/10;
quan.lenth=1;
}
ten.num[0]=sorce.num[0]%10;
ten.num[1]=sorce.num[0]/10;
ten.lenth=(ten.num[1]!=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;
}
ten=changeten(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: