大数相加(c++)(包含string char int 转换)

引 : 字符和数字转换 

  注意,在多次使用同一个stringstream对象,每次使用后都需要对其进行清空,既要清空其状态(clear()),又要清空其内容(str(“”)),否则将有可能出现“Debug Assertion Failed!”的错误!!

头文件 # include <sstream>
string --> int (int-->string 同理)

# include <iostream>
# include <string>
# include <sstream>
using namespace std;
int main(){
	stringstream stream ;//第二个stream可自由定义
	string str;
	int num ;
	cin >> str;
    stream << str;// 向流中传值 切忌  >>
    stream >> num;// 向num传值
    stream.clear();//进行多次类型转换前要清空状态
    stream.str("");//清空内容 
  	cout <<"string转int:"<< num << endl; 
	return 0 ;
}

string -->char[]

​
# include <iostream>
# include <algorithm>
# include <sstream>
using namespace std;
int main(){
	stringstream stream ;
	string str;
	int num ;
	char ch[100];
	cin >> str;
    stream << str;// 向流中传值 切忌  >>
    stream >> ch;// 向ch传值
  	cout <<"string转char:"<< ch << endl; 
  	stream.clear();
  	stream.str("");
  	return 0 ;
}

​

char --> int (int --> char  同理)

​
# include <iostream>
# include <algorithm>
# include <sstream>
using namespace std;
int main(){
	stringstream stream ;
	string str;
	int num ;
	char ch[100];
	cin >> ch;
    stream << ch;// 向流中传值 切忌  >>
    stream >> num;// 向num传值
  	cout <<"char转int:"<< num << endl; 
  	stream.clear();
  	stream.str("");
  	return 0 ;
}

​

其次可以用itoa(int, char , 进制)进行 int-->char转换 

那么进入主题:大数相加

对于较大的数超过long  程序不可能通过一条指令计算出两个大整数之和,

这时候就需要把它存入数组中 , 进行我们最熟悉的 ! 从小学就学的 列竖式运算

如123+222 :

1  2  3 

2   2  2

——————————

思路:从个位数一直运算到最大位,当每 对 位数之和大于10 就让和%10 ,并让前一位进一(+1)

注:字符转数字,减去‘0’;数字转字符加上‘0’;

代码如下

# include <iostream>
# include <algorithm>
# include <cstring>
# include <string>
# include <cmath>
# include <sstream>
using namespace std;
string BigPlus (string num1 , string num2 ){
	string t ; 
	if(num1.length()<num2.length()){ // 在这里让num1 成为长度最长的string
		t = num1 ;
		num1 = num2 ;
		num2  = t ;
	}
	int len1 = num1.length(),len2 = num2.length();
	int a , b , sum = 0 ;//a, b用来记录num1 和num2 的每一位数 
	int logo = 0 ;// logo 作为记录位数之和是否大于十,大于十则记录为1,用来进位。logo不要忘记初始化成0

	while ( len1 > 0 ){  //sum1 len1 最长 ,让len1 作为循环条件
		a = num1[len1 - 1] - '0'; //从最后一位数开始赋值,-‘0’用来转换成int
		if (len2 > 0){//由于len2<len1 ,要加判断条件来判断num2 是否遍历完
			b = num2[len2 - 1] - '0';
		}
		else//  若num2 遍历完, 就让b = 0 :
			b = 0 ;
		sum = a + b + logo;//此处logo 如果是1,那么就代表上一次循环需要进位,sum便加一,即 进位成功
		if ( sum >= 10 ){// 当位数和大于 10 , logo = 1, sum%10 变成一位数
			logo = 1;
			num1[len1 - 1] = sum%10 + '0';// +'0'转换成字符
		}
		else { // 位数和小于十就好写了
			logo = 0 ;
			num1[len1 - 1] = sum + '0';
		}

		len1 -- ;
		len2 -- ;

	}
	if (logo){// while循环外还要一层判断 , 判断 最高位数之和是否大于10
		num1 = '1' + num1; //大于十则加1 ,c++和Java相同, 可用“+”连接字符串
	}	

	return num1;
}

int main(){
//	stringstream stream;
// 题意要传入int ,就按照注释写,倒不如直接传入string
	string num1 , num2;
	int k1 , k2;
	cin >> k1 >> k2;
	cin >> num1 >> num2;
//	stream << k1 ;
//	stream  >> num1;
//	stream.clear();
//	stream << k2;
//	stream >> num2;
//	stream.clear();
	cout << BigPlus(num1,num2)<< endl;
	return 0 ;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值