當前位置:
首頁 > 知識 > 模板小程序十進位大數相加(正整數版本+含負數版本),包含合法性檢查

模板小程序十進位大數相加(正整數版本+含負數版本),包含合法性檢查

為適應於不同用途,將大數演算法寫成了兩個版本,分別為只處理正整數的版本和包含負數處理的版本,可根據需要選用。

版本1:只能處理正整數

1 //大數相加(十進位正整數),用string處理
2 #include <iostream>
3 #include <string>
4 #include <algorithm>
5
6 using namespace std;
7
8 //輸入數據合法性檢查,數字必須在0-9範圍內
9 bool IsVaild(const string& num1,const string& num2)
10 {
11 for(auto val:num1)
12 {
13 if(!(val>="0" && val-"0"<="9"))
14 return false;
15 }
16 for(auto val:num2)
17 {
18 if(!(val>="0" && val<="9"))
19 return false;
20 }
21 return true;
22 }
23
24 string greatNumberAdd(string num1,string num2)
25 {
26 const size_t len1=num1.length;
27 const size_t len2=num2.length;
28 const size_t n=len1>len2 ? len1 :len2;
29 reverse(num1.begin,num1.end);
30 reverse(num2.begin,num2.end);
31
32 string result;
33 int carry=0;
34 for(size_t i=0;i<n;++i)
35 {
36 const int num1i = i<len1 ? num1[i]-"0" :0;
37 const int num2i = i<len2 ? num2[i]-"0" :0;
38 const int val = (num1i+num2i+carry)%10;
39 carry=(num1i+num2i+carry)/10;
40 result.insert(result.begin,val+"0");
41 }
42 if(1==carry)//若最前面有進位,則插入"1"
43 result.insert(result.begin,"1");
44
45 return result;
46 }
47
48 int main
49 {
50 string num1,num2;
51 while(cin>>num1>>num2)
52 {
53 if(IsVaild(num1,num2))
54 cout<<greatNumberAdd(num1,num2)<<endl;
55 else
56 cout<<"輸入數據不合法"<<endl;
57 }
58 return 0;
59 }

版本2:可處理正負整數(STL編碼風格)

1 //大數相加(十進位正負整數),用string處理
2 #include <iostream>
3 #include <string>
4 #include <algorithm>
5
6 using namespace std;
7
8 //輸入數據合法性檢查,數字必須在0-9範圍內
9 bool IsVaild(const string& num1,const string& num2)
10 {
11 for(size_t i=0;i<num1.length;++i)
12 {
13 if(0==i && "-"==num1[0] && ++i<num1.length){};//首位可以是"-",這裡直接加i,繼續判斷
14 if(!(num1[i]>="0" && num1[i]-"0"<="9"))
15 return false;
16 }
17 for(size_t i=0;i<num2.length;++i)
18 {
19 if(0==i && "-"==num2[0] && ++i<num2.length){};//首位可以是"-",這裡直接加i,繼續判斷
20 if(!(num2[i]>="0" && num2[i]-"0"<="9"))
21 return false;
22 }
23 return true;
24 }
25
26 //輔助函數:num1-num2
27 string __greatNumberMinu(string num1,string num2)
28 {
29 const size_t len1=num1.length;
30 const size_t len2=num2.length;
31 const size_t n=len1>len2 ? len1 :len2;
32 reverse(num1.begin,num1.end);
33 reverse(num2.begin,num2.end);
34
35 string result;
36 int carry=0;//借位
37 for(size_t i=0;i<n;++i)
38 {
39 const int num1i = i<len1 ? num1[i]-"0" :0;
40 const int num2i = i<len2 ? num2[i]-"0" :0;
41 const int val = (num1i-carry-num2i>=0) ? (num1i-carry-num2i) : (num1i-carry-num2i+10);
42 carry=(num1i-carry-num2i>=0) ? 0 : 1;
43 result.insert(result.begin,val+"0");
44 }
45 int firstIndex_notEqualTo_0=0;//找出第一個不為0的位置(如果前面均為0,則抹去)
46 for(;firstIndex_notEqualTo_0<result.length;++firstIndex_notEqualTo_0)
47 {
48 if(result[firstIndex_notEqualTo_0]!="0")
49 break;
50 }
51 if(firstIndex_notEqualTo_0>0)//(如果前面均為0,則抹去)
52 result.erase(0,firstIndex_notEqualTo_0);
53
54 return result;
55 }
56
57 //輔助函數:符號為一正一負時調用,這裡的num1和num2不包含符號位(較大的減較小的,在本函數內判斷),sign為判斷位
58 string _greatNumberMinu(string num1,string num2,bool flag)
59 {
60 string result;
61 const size_t len1=num1.length;
62 const size_t len2=num2.length;
63
64 if(len1>len2)
65 {
66 result=__greatNumberMinu(num1,num2);
67 if(flag)
68 result.insert(result.begin,"-");//在最前面添加"-"
69 }
70 else if(len1<len2)
71 {
72 result=__greatNumberMinu(num2,num1);
73 if(!flag)
74 result.insert(result.begin,"-");//在最前面添加"-"
75 }
76 else//len1==len2
77 {
78 if(num1>num2)//字元串比較
79 {
80 result=__greatNumberMinu(num1,num2);
81 if(flag)
82 result.insert(result.begin,"-");//在最前面添加"-"
83 }
84 else
85 {
86 result=__greatNumberMinu(num2,num1);
87 if(!flag)
88 result.insert(result.begin,"-");//在最前面添加"-"
89 }
90 }
91
92 return result;
93 }
94
95 //輔助函數:符號為兩正和兩負時調用,這裡的num1和num2不包含符號位
96 string _greatNumberAdd(string num1,string num2)
97 {
98 const size_t len1=num1.length;
99 const size_t len2=num2.length;
100 const size_t n=len1>len2 ? len1 :len2;
101 reverse(num1.begin,num1.end);
102 reverse(num2.begin,num2.end);
103
104 string result;
105 int carry=0;//進位
106 for(size_t i=0;i<n;++i)
107 {
108 const int num1i = i<len1 ? num1[i]-"0" :0;
109 const int num2i = i<len2 ? num2[i]-"0" :0;
110 const int val = (num1i+num2i+carry)%10;
111 carry=(num1i+num2i+carry)/10;
112 result.insert(result.begin,val+"0");
113 }
114 if(1==carry)//若最前面有進位,則插入"1"
115 result.insert(result.begin,"1");
116
117 return result;
118 }
119
120 //大數相加入口,先判斷符號(兩正、兩負、一正一負),再調用輔助函數
121 string greatNumberAdd(string num1Andsign,string num2Andsign)
122 {
123 string result;
124 if("-"==num1Andsign[0] && "-"==num2Andsign[0])//兩負
125 {
126 result=_greatNumberAdd(num1Andsign.substr(1,num1Andsign.length-1),num2Andsign.substr(1,num2Andsign.length-1));
127 result.insert(result.begin,"-");//在最前面添加"-"
128 }
129 else if("-"==num1Andsign[0] || "-"==num2Andsign[0])//一正一負
130 {
131 if("-"==num1Andsign[0])
132 result=_greatNumberMinu(num1Andsign.substr(1,num1Andsign.length-1),num2Andsign,true);
133 else if("-"==num2Andsign[0])
134 result=_greatNumberMinu(num1Andsign,num2Andsign.substr(1,num2Andsign.length-1),false);
135 }
136 else
137 result=_greatNumberAdd(num1Andsign,num2Andsign);//兩正
138
139 return result;
140 }
141
142 int main
143 {
144 string num1,num2;
145 while(cin>>num1>>num2)
146 {
147 if(IsVaild(num1,num2))
148 cout<<greatNumberAdd(num1,num2)<<endl;
149 else
150 cout<<"輸入數據不合法"<<endl;
151 }
152 return 0;
153 }

為方便理解,特畫出版本二的程序運行流程圖(為圖示清晰,省略了函數形參):

模板小程序十進位大數相加(正整數版本+含負數版本),包含合法性檢查

參考資料來源說明:

2、含負數版本,參考了這篇文章的實現思路:http://blog.csdn.net/to_be_better/article/details/50375420

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

自動生成proto Js語句
Echarts關係圖-力引導布局
原型原型鏈學習記錄
iOS用域名或主機名獲取IP地址
默默前行的livego——基於go語言的rtmp直播伺服器

TAG:科技優家 |

您可能感興趣

DNF:體驗服減負版本更新劃重點,魔岩石獎勵改為現版本數量+1
一加6超大容量版本曝光 售價是這個數
生化危機啟示錄2的完整版本包含兩個額外的情節
華為平板M5參數規格曝光 要三版本齊發?
爐石傳說——偶數質變—新版本偶數術攻略
DNF95版本防具一覽:重甲數據最好看 板甲輕甲實戰效果好
《巫師3》藝術設定集(非中文和諧版,PDF轉JPG格式,小體積版本)
紅麥輿情監測系統新版本上線,V4.8版本全面升級更強大
萬國葡七V5版本與老版本有何區別
絕地求生大逃殺新版本二倍鏡怎麼用 新版本二倍鏡正確使用方法
《生化危機2》重製版本暫不採用VR模式
舊版本 VS 新部編
《真三國無雙8》版本更新 PS4版毫無幀數調整痕迹!
為適應國內審批規則《彩虹六號》全球版本統一和諧
VS沛納海V1版本與升級後的V2版本 詳細評測
小數乘除法知識拓展練習(答案版本)
新版本新細節 細數DNF戰鬥的號角良心改動
價格是關鍵 小米8新增4GB/8GB運存版本
電腦查看主板BIOS版本型號的具體操作步驟
WIIU模擬器新版本性能提升 支持4K畫質