复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231#ifndef UNICODE typedef string _tstring; #else typedef wstring _tstring; #endif //! bool isSmaller(_tstring str1, _tstring str2) { int n1 = str1.length(), n2 = str2.length(); if (n1 < n2) { return true; } if (n2 < n1) { return false; } for (int i = 0; i < n1; i++) { if (str1[i] < str2[i]) { return true; } else if (str1[i] > str2[i]) { return false; } } return false; } /*********************************************************************** 函数名称 :SubBigDataAux 函数功能 :两个大数据数值相减(必须正整数) 函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息 @param _tstring str1 _IN_ 第一个相减的数值 @param _tstring str2 _IN_ 第二个相减的数值 @param bool bRemovePrex=true 是否移除前导的0 返回值 : @return _tstring 两个数值相减的结果 ------------------------------------------------------------------------ 备注 : 输入的参数的要求:“必须是正数” 如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高 如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数 ------------------------------------------------------------------------ 示例 : ************************************************************************/ _tstring SubBigDataAux(_tstring str1, _tstring str2,bool bRemovePrex=true) { bool bNeg = false; if (isSmaller(str1, str2)) { swap(str1, str2); bNeg = true; } _tstring str = L""; int n1 = str1.length(), n2 = str2.length(); reverse(str1.begin(), str1.end()); reverse(str2.begin(), str2.end()); int carry = 0; for (int i = 0; i < n2; i++) { int sub = ((str1[i] - '0') - (str2[i] - '0') - carry); if (sub < 0) { sub = sub + 10; carry = 1; } else { carry = 0; } str.push_back(sub + '0'); } for (int i = n2; i < n1; i++) { int sub = ((str1[i] - '0') - carry); carry = 0; str.push_back(sub + '0'); } reverse(str.begin(), str.end()); if (bRemovePrex) { //去掉前导的‘0’ while (true) { if (str[0] == L'0') { str.erase(str.begin()); } else { break; } } } if (str.empty()) { str = L"0"; } if (bNeg) { str.insert(str.begin(), L'-'); } return str; } /*********************************************************************** 函数名称 :AddBigData 函数功能 :两个大数据进行相加(必须为正整数 ) 函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息 @param _tstring s _IN_ 第一个相加的结果 @param _tstring r _IN_ 第二个相加的结果 返回值 : @return _tstring 两个整数相加的结果 ------------------------------------------------------------------------ 备注 : 输入的参数的要求:“必须是正整数” 如果确保数据是正整数的话,请使用AddBigDataAux,这个函数运行的效率更高 如果不能够保证输入参数是正整数的话,请使用AddBigData这个函数 ------------------------------------------------------------------------ 示例 : ************************************************************************/ _tstring AddBigDataAux(_tstring s, _tstring r) { int re = 0; _tstring digit; if (r.length() < s.length()) r.insert(r.begin(), s.length() - r.length(), '0'); else if (r.length() > s.length()) s.insert(s.begin(), r.length() - s.length(), '0'); for (int i = s.length() - 1; i >= 0; --i) { int a = (int(s[i] + r[i]) + re - 96); digit.insert(digit.begin(), char(a % 10 + 48)); re = a / 10; } if (re != 0) digit.insert(digit.begin(), char(re + 48)); return digit; } /*********************************************************************** 函数名称 :SubBigData 函数功能 :两个大数据相减(可以为float型的数据) 函数参数 : 参数列表格式 [_IN_ _OUT_ _OPTION_] 参数名 说明信息 @param _tstring s _IN_ 第一个相减的数据 @param _tstring r _IN_ 第二个相加的数据 返回值 : @return 返回两个字符串相减的结果 ------------------------------------------------------------------------ 备注 : 输入的参数的要求:“必须是正数”,但是可以是浮点型的数据 如果确保数据是正整数的话,请使用SubBigDataAux,这个函数运行的效率更高 如果不能够保证输入参数是正整数的话,请使用SubBigData这个函数 ------------------------------------------------------------------------ 示例 : ************************************************************************/ _tstring SubBigData(_tstring s, _tstring r) { size_t pos1 = s.find(L'.'); size_t pos2 = r.find(L'.'); _tstring SInt, SFac, RInt, RFac;//两个字符串的整数部分和小数部分 if (pos1 == _tstring::npos)//如果没有找到的话 { SInt = s; SFac = L""; } else { SInt = s.substr(0, pos1); SFac = s.substr(pos1 + 1); } if (pos2 == _tstring::npos) { RInt = r; RFac = L""; } else { RInt = r.substr(0, pos2); RFac = r.substr(pos2 + 1); } _tstring Int, Fac;//整数相减的结果、浮点数相减的结果 if (SFac.length() > RFac.length()) { RFac.insert(RFac.end(), SFac.length() - RFac.length(), '0'); } else { SFac.insert(SFac.end(), RFac.length() - SFac.length(), '0'); } bool bNeg = false; if (isSmaller(SInt, RInt)) { swap(SInt, RInt); swap(SFac, RFac); bNeg = true; } else if ((SInt==RInt)&&(isSmaller(SFac,RFac))) { swap(SInt, RInt); swap(SFac, RFac); bNeg = true; } Int = SubBigDataAux(SInt, RInt); Fac = SubBigDataAux(SFac, RFac,false); if (Fac.find(L'-') != _tstring::npos)//如果相减为负数的话,说明要进行进制操作 { _tstring temp = L"1"; temp.insert(temp.end(), SFac.length(), L'0'); temp = AddBigDataAux(temp, SFac); Fac = SubBigDataAux(temp, RFac);//小数处理部分 Fac.insert(Fac.begin(), L'.'); //整数处理部分 if (Int.find(L'-') != _tstring::npos) { Int.erase(Int.begin()); Int = SubBigDataAux(Int, L"1"); Int.insert(Int.begin(), L'-'); } else { Int = SubBigDataAux(Int, L"1"); } } else { //小数部分 Fac.insert(Fac.begin(), L'.'); } _tstring result = Int + Fac; if (bNeg) { result.insert(result.begin(), L'-'); } return result; }
最后
以上就是单薄发箍最近收集整理的关于十进制数据相减(大数据)的全部内容,更多相关十进制数据相减(大数据)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复