hdoj-1877,m进制大数加法

题目连接http://acm.hdu.edu.cn/showproblem.php?pid=1877

我做这个题的方法比较笨,由于题目中要输入的两个数的和可能超过整数的范围,所以我采取的是先将两个数转换为m进制的数,然后在进行运算

对于大数的加法,用到的方法和hdoj 1002中的方法一样,只不过这里用到的是整型数组

下面给出大数加法核心算法,如果两个数转换为m进制后,存放在数组里的长度一致,进行如下操作

if(jz(m,c)==jz(m,b))//jz(m,b)为十进制b,转换为m进制后存放在整型数组中的长度。
		{
			for(t=0;t<jz(m,b);t++)
			{
				if(s1[t]+s2[t]+jw<m){s[t]=s1[t]+s2[t]+jw;jw=0;}//jw为进位,s[i]存放最终结果
				else {s[t]=s1[t]+s2[t]+jw-m;jw=1;}
			}
		}
如果两个数转换为m进制后,存放在数组里的长度不一致,进行如下操作(需进行两次这样的操作  既:a>b一次,b>a一次)

else if(jz(m,c)>jz(m,b))
		{
			for(t=0;t<jz(m,b);t++)
			{	if(s1[t]+s2[t]+jw<m){s[t]=s1[t]+s2[t]+jw;jw=0;}
				else {s[t]=s1[t]+s2[t]+jw-m;jw=1;}
			}
			for(t=jz(m,b);t<jz(m,c);t++)
			{	if(s1[t]+jw<m){s[t]=s1[t]+jw;jw=0;}
			else {s[t]=s1[t]+jw-m;jw=1;}
			}
		}
if(jw==1)s[t++]=1;//判断最后一位有没有进位


最后贴上进制转换函数

int jz(int m,int x)
{
	memset(a,0,sizeof(a));
	int i=0;
	while(x)
	{
		a[i++]=x%m;
		x=x/m;
	}
	return i;
}


贴上一个简单的

int a[20];
int jz(int m,int x)
{
	memset(a,0,sizeof(a));
	int i=0;
	while(x)
	{
		a[i++]=x%m;
		x=x/m;
	}
	return i;
}
int main()
{
	int m,c,b,j;long s;
	while(cin>>m&&m!=0)
	{
		cin>>c>>b;
		s=c+b;
		if(s==0)cout<<"0"<<endl;
		else 
		{
		j=jz(m,s);
		for(j=j-1;j>=0;j--)
			cout<<a[j];
		cout<<endl;
		}
	}
return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值