#include<iostream>
#include<string.h>
#include <stdexcept>
using namespace std;
std::logic_error e("Invalid Parameters.");
void add1(string,string);
void add2(string,string);
int main(){
string number1,number2;
cin>>number1;
cin>>number2;
add1(number1,number2);
add2(number1,number2);
}
//只能计算不带正负号的两个正数的和
void add1(string number1,string number2)
{
int len_1=number1.size();
int len_2=number2.size();
//判断字符串是否为纯数字
for(int i=0;i<len_1;i++){
if(number1[i]>'9'||number1[i]<'0'){
throw new std::exception(e);
}
}
for(int i=0;i<len_2;i++){
if(number2[i]>'9'||number2[i]<'0'){
throw new std::exception(e);
}
}
//选一个最长的字符串作为求和数组的长度
int max_len=0;
if(len_1>=len_2){
max_len=len_1;
}else{
max_len=len_2;
}
int arr_1[max_len],arr_2[max_len],max_arr[max_len],carry=0;
//将两个字符串分别导入数组arr_1,arr_2,数组中位数由低到高
for(int i=0;i<max_len;i++){
arr_1[i]=number1[--len_1]-'0';
}
for(int i=0;i<max_len;i++){
arr_2[i]=number2[--len_2]-'0';
}
memset(max_arr,0,sizeof(max_arr));
//求和运算
for(int i=0;i<max_len;i++){
max_arr[i]=(arr_1[i]+arr_2[i]+carry)%10;
carry=(arr_1[i]+arr_2[i]+carry)/10;
}
//进位为1说明溢出,将其打印在最前边
if(carry){
cout<<carry;
}
//数组从高到低打印
for(int i=max_len-1;i>=0;i--){
cout<<max_arr[i];
}
cout<<endl;
}
//可以计算任何带符号的两个数的和
void add2(string number1,string number2)
{
int len_1=number1.size();
int len_2=number2.size();
int real_len1=0,real_len2=0;
//判断输入字符串是否合法,开头为"+","-"均为合法
for(int i=0;i<len_1;i++){
if(i==0&&(number1[i]=='+'||number1[i]=='-')){
continue;
}
//统计除了字符后数字的长度
real_len1++;
if(number1[i]>'9'||number1[i]<'0'){
throw new std::exception(e);
}
}
for(int i=0;i<len_2;i++){
if(i==0&&(number2[i]=='+'||number2[i]=='-')){
continue;
}
real_len2++;
if(number2[i]>'9'||number2[i]<'0'){
throw new std::exception(e);
}
}
int max_len=0;
int is_minus=0;
//比较数字的长度选择较长的作为求和数组长度
if(real_len1>real_len2){
max_len=real_len1;
}else{
max_len=real_len2;
}
//两个字符串符号不同时表示两数相减
if(number1[0]=='-'&&number2[0]!='-'||number1[0]!='-'&&number2[0]=='-'){
is_minus=1;
}
int arr_1[max_len],arr_2[max_len],max_arr[max_len],carry=0;
memset(max_arr,0,sizeof(max_arr));
memset(arr_1,0,sizeof(max_arr));
memset(arr_2,0,sizeof(max_arr));
//只存储数字,数字中位数由低到高
for(int i=0;i<max_len;i++){
len_1--;
if(number1[len_1]>'9'||number1[len_1]<'0'){
continue;
}
arr_1[i]=number1[len_1]-'0';
}
for(int i=0;i<max_len;i++){
len_2--;
if(number2[len_2]>'9'||number2[len_2]<'0'){
continue;
}
arr_2[i]=number2[len_2]-'0';
}
//is_minus为0说明进行的是求和运算
if(is_minus==0){
for(int i=0;i<max_len;i++){
max_arr[i]=(arr_1[i]+arr_2[i]+carry)%10;
carry=(arr_1[i]+arr_2[i]+carry)/10;
}
//当两数均为负数,结果肯定为负数
if(number1[0]=='-'&&number2[0]=='-'){
cout<<'-';
}
//进位位不为0说明有进位
if(carry){
cout<<carry;
}
}else{
//符号不同,进行两数求差
//为了简便运算,总是选择较大的数作为被减数
if(real_len1>real_len2||(real_len1==real_len2&&number1[1]>number2[1])){
for(int i=0;i<max_len;i++){
int value=(arr_1[i]-arr_2[i]-carry);
if(value<0){
value+=10;
carry=1;
}else{
carry=0;
}
max_arr[i]=value;
}
if(carry){
cout<<"-";
}
}else{
for(int i=0;i<max_len;i++){
int value=(arr_2[i]-arr_1[i]-carry);
if(value<0){
value+=10;
carry=1;
}else{
carry=0;
}
max_arr[i]=value;
}
if(carry){
cout<<"-";
}
}
}
//打印操作,为0不打印,符号阅读习惯
int is_zero=true;
for(int i=max_len-1;i>=0;i--){
if(is_zero&&max_arr[i]!=0){
is_zero=false;
}
if(!is_zero){
cout<<max_arr[i];
}
}
if(is_zero){
cout<<0;
}
cout<<endl;
}
剑指Offer-拓展题-大数求和(含负数)
最新推荐文章于 2023-05-07 22:52:08 发布