引 : 字符和数字转换
注意,在多次使用同一个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 ;
}