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

本文聚焦于大数处理中的进制转换,通过解析九度OJ的第62题,深入探讨如何在编程中有效地进行大整数的进制转换。文章将引导读者理解并掌握相关算法和技巧。
摘要由CSDN通过智能技术生成

题目地址: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值