算法分析
使用string完成大数存储和加法操作。
时间复杂度 o(n)
c++代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// C = A + B;
string add(const string& A, const string& B)
{
string C;
int t = 0;
for (int i = A.size()-1, j = B.size()-1; i >= 0 || j >= 0 || t > 0; i--, j--)
{
if (i >= 0) t += (A[i] - '0');
if (j >= 0) t += (B[j] - '0');
C += ((t % 10) + '0');
t /= 10;
}
reverse(C.begin(), C.end());
return C;
}
int main()
{
ios::sync_with_stdio(false);
string A, B;
cin >> A >> B;
cout << add(A, B) << endl;
return 0;
}
有一处可以优化的地方就是
C += ((t % 10) + '0');
可以优化为C = (char)((t % 10) + '0') + C;
,这样就可以直接得到正确顺序,无需翻转了;另外我习惯使用auto结果翻车了,auto i = A.size()-1
会得到无符号整数,它恒大于等于0,所以这个地方只能用int666
#$\overline{大佬太强了}$
C += ((t % 10) + ‘0’); 为什么我写成C=C+(t % 10) + ‘0’; 就报错了。。
#
您现在弄懂了吗,为什么鸭
已回复楼主,可以看一下,不过都三个月了,可能你都已经知道了(/doge)
因为string类型不能和int类型直接相加,
+=
的结合方式是从右到左,而且可以自动进行了类型转换。先算+=
右边的,算完之后再去和+=
左边相加,所以C += ((t % 10) + '0');
是先算(t % 10) + '0'
,算完之后+=
自动把结果进行了类型转换,然后他们才继续相加,所以不会报错。如果你把第二种写法C=C+(t % 10) + '0';
改成C=C+(char)(t % 10 + '0');
应该就不会报错了。其实第一种写法C += ((t % 10) + '0');
,可以写成C += t % 10 + '0';
, 因为 %的优先级比+更高,而且+=是先算右边再算左边,不过出于个人习惯加上也是可以的,毕竟可以防止出错^_^ios::sync_with_stdio(false);
这一行是什么意思?有什么作用?
萌新求普及
加快输入的速率
好的 谢谢大佬
#
#百度:取消两个指针的同步,加快cin的速率,否则比scanf慢很多可能爆T,尤其是在读入大量数据时
同样作用的还有
cin.tie(0);
解除与cout输出流的关联,这样每次cin 或 cout 之前都不会刷新彼此的缓冲区兄弟markdown语法用的挺好
提供一个没用string的写法,纯手写!
C += ((t % 10) + ‘0’);加‘0’的目的是什么呀
$\overline{转换成ASCII}$
string add(const string& A, const string& B)中&是干嘛的
引用
有进位的时候怎么处理的啊
i >= 0 || j >= 0 || t > 0
这里就包括了有进位的处理