题目描述
高精度加法
样例
$a, b$ 均为正整数
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int A[N], B[N], C[N];
int Add(int a[], int b[], int c[], int cnt) {
int t = 0;//t表示进位
for (int i=1; i<=cnt; i++) {
t += a[i] + b[i];//进位加上a和b第i位上的数
c[i] = t % 10;//c的值就是进位的个位数
t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
}
if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上
return cnt;
}
int main() {
string a, b;
cin >> a >> b;
//A和B倒着放进int数组,因为有进位,倒着放容易处理
int cnt1 = 0;
for (int i=a.size()-1; i>=0; i--)
A[++cnt1] = a[i] - '0';
int cnt2 = 0;
for (int i=b.size()-1; i>=0; i--)
B[++cnt2] = b[i] - '0';
int tot = Add(A, B, C, max(cnt1, cnt2));
//因为A和B是倒着放的,所以C也要倒着输出
for (int i=tot; i>=1; i--)
cout << C[i];
}
写得非常棒!!
if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上 这句什么意思??没怎么明白
前一位相加进位最大为1,因为每位上数最大为9
是因为stl不香吗,偏偏要用数组
数组的效率比vector要高一些
高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}
还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}
还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
问一下,数组刚开始没有全部赋值为零,不会产生随机的数吗?
在主函数外开数组全部都会默认成0
多谢,真的解决了我一直的问题!
数组版本的空间复杂度高吧
cnt是什么意思,没有搞懂
我也是,不懂
数字记录成数组,用cnt记录数位长度,要选择最长的那个作为两数之和的数位长度,所以最后如果要进位的话,还需要cnt++
为什么要用vector[HTML_REMOVED]定义A,B,C?
我想问问if(t)啥意思
你可以理解成if(t==1)吧,和题主标注的意思差不多
意思是if(t != 0)
高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}
还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
这个开的数组存的了位数是100000的吗,不是数字大小100000,这开的对吗
vector是变长数组,不用特意指定数组容量,他最多可以存大概10^9个数
感觉最后的进位t有可能不是1 直接
c[++cnt] =t
就好9+9也才18啊。。。进位最大就是1
为什么要a[i]-‘0’;是什么说法
存的时候是字符要改成数字
懂了懂了
不懂就问,为什么数组要从1开始存数据
可以是0啊,我习惯上数组从0 开始
#include [HTML_REMOVED]
#include[HTML_REMOVED]
const long N = 100000;
using namespace std;
void Add(int a[], int b[], int c[], int &n)
{
int t = 0;
for (int i = 0; i < n; i )
{
t += a[i] + b[i];
c[i] = t % 10;
t = (int ) t / 10;
}
if (t > 0) c[n ] = t;
}
int main()
{
string a, b;
int addA[N] = {0}, addB[N] = {0}, result[N] = {0};
int n = 0;
cin >> a >> b;
if (a.size() > b.size()) n = a.size(); else n = b.size();
for (int i = 0; i < a.size(); i ++) addA[a.size() - i - 1] = a[i] - ‘0’;
for (int i = b.size() - 1; i >= 0; i –) addB[b.size() - i - 1] = b[i] - ‘0’;
Add(addA, addB, result, n);
for (int i = n - 1; i >= 0; i –)
printf(“%c”, result[i] + ‘0’);
return 0;
}
不知道为什么输出变这样了 ,将就着看吧
第12行是n ,不知道为什么 消失了
n 加加
加上三个 ` 就好了
对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对
cnt为两个数长度最大的那个,假如cnt1>cnt2,那短的B[cnt]的值是什么,为零吗
是的,你看100写成0000100也可以只是平时没必要,也没人这么写
最好加一个memset,初始化一下
100000100000100000
我慕了,用数组的效率是向量的两倍
用向量平均要80ms,用数组的话效率平均40ms
到后面y总都是用数组模拟讲的hh 因为数据结构数组模拟大都比STL快
在哪看y总数组模拟的代码
大佬啊
我在摸鱼啊
大佬