加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

hdoj-1877,m进制大数加法

发布时间:2020-12-14 03:55:21 所属栏目:大数据 来源:网络整理
导读:题目连接http://acm.hdu.edu.cn/showproblem.php?pid=1877 我做这个题的方法比较笨,由于题目中要输入的两个数的和可能超过整数的范围,所以我采取的是先将两个数转换为m进制的数,然后在进行运算 对于大数的加法,用到的方法和hdoj 1002中的方法一样,只不

题目连接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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读