现在的位置: 首页 > 综合 > 正文

大数加法模板

2013年10月16日 ⁄ 综合 ⁄ 共 1830字 ⁄ 字号 评论关闭
文章目录

写在最前面的

这是一篇关于加法的学习笔记。大数加法在做题的时候遇到了,还以为是什么东西,当时用int挂了,用long long也挂,以为编译器的问题,__int64也挂。肯定是大数了,当然还有大数加法,大数乘法等等,下面是模板。之后也把自己写的大数模板都贴上来。

啊哈,大数加法

大数加法模板:代码思路清晰而简单。在cin或者scanf(总之是输入)之后,加数的高位在字符串的低位,低位在字符串的高位。在这里没有将输入的数字倒转,也就是说这篇代码是从读入空间直接执行加减的(此时加数的最低位都在字符串的最高位),当然如果将两个加数都reverse,执行加法的过程会更加明了,但对于大大数,很大的数,reverse也增加了时间的开销。

char a[1000],		//加数
	b[1000],		//加数
	result[1001];	//和,预留一位

void LagerAdder()
{
	bool c = false;
	int i = 0,
		temp,
		lena,lenb;

	cin >> a >> b;		

	lena = strlen(a);
	lenb = strlen(b);

	i = lena>lenb?lena:lenb;

	while(lena >0 && lenb >0)
	{	
		temp = a[lena-1] - 48 + b[lenb-1] - 48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i--;
		lena--,lenb--;
	}// while

	while(lena>0)
	{
		temp = a[lena-1] -48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i--;
		lena--;
	}// while

	while(lenb>0)
	{
		temp = b[lenb-1] -48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i--;
		lenb--;
	}// while

	result[0] = (c?'1':'0');	//处理最高位,可能会有进位

	char *p;
	p = (result[0]=='0')?		//找寻到一个有效位
		&(result[1]):&(result[0]);
	int len = strlen(p);	
	cout << a ;
	cout << " + " ;
	cout << b;
	cout << " = ";
	cout << p << endl;
}

不知道有没有看懂上面的文字?大满足一下下面是添加reverse后的代码,感觉舒服很多,但是多了3个reverse时间是O(n)。

char a[1000],		//加数
	b[1000],		//加数
	result[1001];	//和,预留一位

void reverse(char * c)
{
	int len = strlen(c);
	for(int i=0; i<len/2; i++)
		swap(c[i],c[len-i-1]);
}

void hdu1002()
{
	cin >> a >> b;
	bool c = false;
	int i = 0,
		ia = 0,ib = 0,
		temp,
		lena,lenb;
	lena = strlen(a),
		lenb = strlen(b);

	reverse(a);
	reverse(b);

	while(ia<lena && ib<lenb)
	{
		temp = a[ia] - 48 + b[ib] - 48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i++;
		ia++,ib++;
	}// while

	while(ia<lena)
	{
		temp = a[ia] -48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i++;
		ia++;
	}// while

	while(ib<lenb)
	{
		temp = b[ib] -48 + (c?1:0);
		result[i] = temp>=10?
			(temp%10+48):temp+48;
		c = temp>9?1:0;
		i++;
		ib++;
	}// while
	result[i] = (c?'1':'\0');	//‘\0’就是不做任何操作啦
	reverse(result);
	reverse(a);
	reverse(b);
	cout << a << " + " << b << " = " << result << endl;
}

本文完 2012-03-19

捣乱小子 http://blog.csdn.net/daoluanxiaozi

抱歉!评论已关闭.