请听题:
乍一看题目,这也太简单了吧,组成一个三角形的条件不就是任意两条边长度之和大于第三边嘛,一开始我也是这样想的,一分钟写完,提交运行,结果当然是:您的代码通过了00.00%的测试用例。这里需要注意题目给的数据范围:1 <= a,b,c <= 10^100,int型能储存的数据范围是-2147483648 ~ 2147483647,大概就是21亿,109 是一亿,1011 就是100亿,已经远远超出了int的范围,所以这时候就可以考虑用string接收了。
double类型的变量可表示的范围是-21024 ~ 21024 ,也可以用于此题
这题的关键就是用string类实现大数的加法运算,这里提供一种思路:
如图,要用string类计算加法,有两种方法可选,一种按照原来的顺序,一种是逆序之后再进行预算。显然,逆序之后从前往后运算的顺序和平时我们计算加法的顺序是相似的,只需要在运算结束后将字符串再逆序一下就可以了。步骤如下:
- 将两个字符串逆序,较短的后面补充合适个数的‘0’
- 运算(运算时要讲字符转换成数字才能计算),详细过程在后面讲
- 将得到的结果逆序后输出
程序:
string add(string& s1, string& s2) {
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
//进位位
int carry = 0;
//暂存每两位的和
int tmp = 0;
size_t i = 0;
//存放和的字符串
string sum;
//在短的末尾补0
if (s2.size() > s1.size()) {
swap(s1, s2);
s2.resize(s1.size(), '0');
}
else {
s2.resize(s1.size(), '0');
}
//sum的大小和较长的字符串一样
sum.resize(s1.size());
for (; i < s1.size(); i++) {
tmp = (s1[i] - '0') + (s2[i] - '0') + carry;
if (tmp >= 10) {
carry = tmp / 10;
}
else
carry = 0;
sum[i] = tmp % 10 + '0';
}
//处理最高位
if (sum[i] - '0' >= 10) {
sum[i + 1] = (sum[i] - '0') / 10 + '0';
sum[i] = (sum[i] - '0') % 10 + '0';
}
reverse(sum.begin(), sum.end());
return sum;
}
有了这个方法后,判断三个数字能否构成三角形就轻而易举了。