大数相乘
题目描述:输入两个很大的正数(用c字符串表示),输出他们的乘积。
采用的方法可以模拟手工乘法
关键步骤
void multiply(const char *a,const char *b){
if (a == NULL&&b == NULL)return;
int i, j, ca, cb, *s;
ca = strlen(a);
cb = strlen(b);
s = new int[ca + cb];
for (int i = 0; i < ca + cb; i++){
s[i] = 0;
}
for (int i = 0; i < ca; i++)
for (int j = 0; j < cb; j++)
s[i + j + 1] += (a[i] - '0')*(b[j] - '0');
for (int i = ca+cb-1; i >=0; i--)
if (s[i] > 9){
s[i - 1] += s[i] / 10;
s[i] = s[i] % 10;
}
string c;
i = 0;
while (s[i] == 0)i++;
for (; i < ca + cb; i++)
c.push_back(s[i] + '0');
cout << c << endl;
}
字符串数字转换为数值
核心思想:可以依次扫描字符串,每扫描到一个字符,我们把在这之前得到的数字乘以10再加上当前字符表示的数字。
核心代码:
while (*digit != '/0'){
if (*digit >= '0'&&*digit <= '9'){
num = num * 10 + (*digit - '0');
if (num > std::numeric_limits<int>::max()){ //语句1
num = 0;
break;
}
digit++;
}
}
在这里面值得注意的是基本数据类型最大值的获取方法:语句1