大数减法

最近在准备微软的暑期实习面试,看了些面经有问到这样一道题目。写两个大数的减法,并在控制台输出。

思路:

考虑到大数减法,其实主要是要考虑在内存中怎么存储大数。这里面主要有几个思路。一是采用科学计数法,比如100可以写成10^2等等。这种因为题目中提到还要在控制台中输出,并显示成字符串的形式。所以比较容易想到另一种表示大数的方式,那就是采用字符串的形式。这样从头到尾处理起来就会变得十分和谐。

解决了数的表示,那么现在就应该考虑数的减法怎么来实现了。其实细想起来,还是比较容易的。毕竟我们从一上学开始就接触到了数的减法。这样我们只需要按部就班的从低位开始减起就可以了。当前位不够减的情况下,就向前一位借1。。。

我在实现的时候,采用标志位flag来表示借位,0表示没有借位,-1表示借了1。所以在每一位计算中还要加上flag。

贴上代码:

#include <iostream>

using namespace std;

void mySub(char a[],int lenA,char b[],int lenB,char c[])
{
	//在进行减法之前最好,先比较下a和b的大小,为方便起见
	//我们始终让a指向比较大的数。这样减法计算的结果总为
	//正数。如果之前的判断为b>a,只需设置标志位,在输出时
	//输出负号即可。这样做可以起到简化问题的目的。
	int j = lenB-1;
	int i = lenA-1;
	int flag = 0;
	while (j>=0)
	{
		int temp = a[i]-b[j]+flag;
		if (temp>=0)
		{
			flag = 0;
		} 
		else
		{
			temp = temp + 10;
			flag = -1;
		}
		c[i] = temp + '0';
		i--;
		j--;	
	}
	while(i>=0)
	{
		c[i] = a[i] + flag;
		flag = 0;
		i--;
	}
	
}

int main(){
	char a[] = "987";
	char b[] = "68";
	char c[3];
	mySub(a,strlen(a),b,strlen(b),c);
	for(int i=0;i<3;i++){
		cout << c[i];
	}
	cout << endl;
}

你可能感兴趣的:(大数减法)