#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-拓展題-大數求和(含負數)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.