大数相加和大数相乘
大数相加:
从后向前变量相加的字符串,并将当前位的数转为整型进行加法操作,并判断是否有进位,保存进位,以便进行下一次的操作。
代码:
//大数相加
char* add(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int i = len1 - 1;
int j = len2 - 1;
int temp = 0;//进位
int max = len1 > len2 ? len1 : len2;
//定义结果字符
char *ans = new char[max + 1];
memset(ans, 0, max + 1);//初始化
ans[max--] = '\0';
for (; i >= 0 && j >= 0; --i, --j) {
int sum = (str1[i] - '0') + (str2[j] - '0') + temp;
if (sum >= 10) {//当前位结果大于10
sum -= 10;
temp = 1;//进位设为1
}
else {
temp = 0;
}
ans[max--] = sum + '0';
}
//第一个字符串还有剩余
while (i >= 0) {
ans[max--] = ((str1[i--] - '0') + temp) + '0';
if (temp == 1) {
temp = 0;
}
}
//第二个字符串还有剩余
while (j >= 0) {
ans[max--] = ((str2[j--] - '0') + temp) + '0';
if (temp == 1) {
temp = 0;
}
}
return ans;
}
大数相乘:
//字符串逆转
void reverseOrder(char *a, int begin, int end) {
char temp;
while (begin < end) {
temp = a[begin];
a[begin] = a[end];
a[end] = temp;
++begin;
--end;
}
}
//大数相乘
char* mutil(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
char *ans = new char[len1 + len2 + 1];
memset(ans, '0', len1 + len2 + 1);
ans[len1 + len2] = '\0';
reverseOrder(str1, 0, len1 - 1);
reverseOrder(str2, 0, len2 - 1);
int mulitFag;//乘法进位
int addFag;//加法进位
for (int i = 0; i < len2; ++i) {//str2的每一位
mulitFag = 0;
addFag = 0;
for (int j = 0; j < len1; ++j) {//str1的每一位
int temp1 = (str1[j] - '0') * (str2[i] - '0') + mulitFag;//计算str2的一位和str1的每一位的积
mulitFag = temp1 / 10;//计算乘法进位,如35/10=3进位为3
temp1 = temp1 % 10;//求出个位数的值,如35%10=5
int temp2 = (ans[i + j] - '0') + temp1 + addFag;//计算当前位+求积的个位数+和的进位
addFag = temp2 / 10;//求和的进位,是否大于10
ans[i + j] = temp2 % 10 + '0';//求出当前位的个位数,并转为字符
}
//保存一次乘积的最高位的数
ans[i + len1] += mulitFag + addFag;
}
reverseOrder(ans, 0, len1 + len2 - 1);
return ans;
}
主函数:
int main() {
char data1[] = "1234567891234567";
char data2[] = "234567899876543221";
char *str3 = add(data1, data2);
cout << str3 << endl;
char str1[] = "123";
char str2[] = "57";//180
char *str4 = mutil(str1, str2);
if (str4[0] != '0')
cout << str4;
else
cout << (str4 + 1);
cout << endl;
system("pause");
return 0;
}
不积跬步,无以至千里;不积小流,无以成江海。