大数四则运算

注意:易错地方就是字符与数字的转换
例如:

  a += e +'0'; //在字符串中为字符2 在输出流中就是50(当做Int)
   if(e < 0){//此时char被转换为int类型
       printf("yes"); 
  }
一、大数加法
lensum需要大一位

string bigAdd(const string a,const string b)
	{
		int lena = a.size();
		int lenb = b.size();
		int lensum = lena > lenb ? lena+1 : lenb+1;
		vector res;
		res.resize(lensum);		
		for(int i = 0,j = 0; i < lena && j < lenb; ++i,++j){
			res[i] = a[lena-i-1]-'0' + b[lenb-i-1]-'0';
		}
		if(lena > lenb){
			for(int i = lenb; i < lena; ++i){
				res[i] = a[lena-i-1]-'0';
			}
		}
		else if(lenb > lena){
			for(int i = lena; i < lenb; ++i){
				res[i] = b[lenb-i-1]-'0';
			}
		}
		for(int i = 0; i < lensum-1; ++i){
			if(res[i] > 9){
				int t = res[i]/10;
				res[i] = res[i]%10;
				res[i+1] += t;
			}
		}
		string r = "";
		if(res[lensum-1]){//考虑最高位进位情况
			r += res[lensum-1]+'0';//还原为字符类型加入到结果
		}
		for(int i = lensum-2; i >= 0; --i){//这里是lensum-2 
			r += res[i]+'0';//都要转换为字符处理
		}	
		return r;		
	}


二、大数减法:

string bigSub(const string a,const string b)
	{
		int lena = a.size();
		int lenb = b.size();
		int max_len = lena > lenb ? lena : lenb;
		vector res;
		res.resize(max_len);
		int flag = 1;
		if(lena < lenb || (lena == lenb && a < b)){
			flag = 0;
		}
		if(flag)
			cout <<"a >= b"<= b时候 
			for(int i = 0; i < lenb; ++i){
				res[i] = a[lena-i-1]-b[lenb-i-1];
			}
			for(int i = lenb; i < lena; ++i){
				res[i] = a[lena-i-1]-'0';
			}
		}
		else{
			for(int i = 0; i < lena; ++i){
				res[i] = b[lenb-i-1]-a[lena-i-1];
			}
			for(int i = lena; i < lenb; ++i){
				res[i] = b[lenb-i-1]-'0';
			}
		}
		for(int i = 0; i < max_len; ++i){
			if(res[i] < 0){
				res[i] += 10;
				res[i+1] -= 1;
			}
		}
		string r = "";
		if(!flag)
			r += "-";
		int k;	
		for(k = max_len-1; k >= 0; --k){ //过滤掉前缀 0 
			if(res[k] != 0) break;
		}
		if(k == -1){ 
			return r += '0';
		}
		for(; k >= 0; --k){
			r += res[k]+'0';
		}

		return r;
	}


三、大数乘法:

刚开始乘法也选择用vector来存,后来发现数大的时候总是出现奇怪字符,突然想起可能是各段和超过了
char类型范围,所以后来用int类型的vector来存储结果
void bigMul(string a,string b)
	{
		int lena = a.size();
		int lenb = b.size();
		int max_len = lena+lenb+1;
		vector res;
		res.resize(max_len);
		reverse(a.begin(),a.end());//把a,b反转
		reverse(b.begin(),b.end());
		for(int i = 0; i < lena; ++i){
			for(int j = 0; j < lenb; ++j){
				res[i+j] += (a[i]-'0') * (b[j]-'0');//这里需要把字符 转换为 数字
			}
		}
		for(int i = 0; i < max_len; ++i){//统一处理进位问题
			if(res[i] > 9){
				res[i+1] += res[i]/10;
				res[i] %= 10;
			}
		}
		int k;
		for(k = max_len-1; k >= 0; --k){//过滤多余的0
			if(res[k] != 0) break;
		}
		if(k == -1){//防止结果为0 的情况呗过滤掉了
			cout << 0;
			return ; 
		}
		for(; k >= 0; --k){//结果输出
			cout << res[k];
		}
		
		return ;
	}

你可能感兴趣的:(大数运算)