微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,sizeof(a));
	int i=0;
	while(x)
	{
		a[i++]=x%m;
		x=x/m;
	}
	return i;
}


贴上一个简单的

int a[20];
int jz(int m,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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐