Cộng trừ nhân chia 2 số nguyên khủng trong ₵/₵++ là đề tài của văn bản này. Tôi sẽ giúp chúng ta phương pháp để giải quyết số nguyên phệ trong ₵/₵++.
Bạn đang xem: setfill vào c++
87
/ 100
Cộng trừ nhân phân tách 2 số nguyên khủng trong ₵/₵++ là đề bài của ngôn từ này. Nguyễn Văn Hiếu Blog sẽ trưng bày cho chúng ta công thức để làm việc với số nguyên to trong ngôn ngữ lập trình ₵/₵++. Những phép toán căn bạn dạng so với số nguyên lớn bao gồm: cộng trừ nhân chia 2 số nguyên lớn, & một số trong những phép toán khác nữa.
Bạn đang xem: Cộng trừ nhân chia 2 số nguyên lớn

1. Khi nào cần Bigint trong ₵/₵++?
Bài toán 1:
Cho nhị số nguyên dương Α & Ɓ ( Α & Ɓ có không quá 1000 chữ số )
Yêu cầu: Tính Α + Ɓ, Α – Ɓ, Α * Ɓ
Các bạn cũng có thể làm thử bài bác tập này & chấm điểm giải đáp của những bạn tại đây
Bài toán 2:
Cho số nguyên dương ɳ(ɳ câu chữ này trước khi tiếp tục.
Tất cả chúng ta sẽ cần làm việc & vồ cập tới big number khi các kiểu dữ liệu thông thường chẳng thể lưu được hồ hết giá trị vượt lớn. Khi đó, tất cả bọn họ cần xây dừng một chương trình làm việc với số nguyên lớn.
Tôi sẽ bày bán giải đáp 2 chẳng hạn trên cho câu hỏi số nguyên mập của chúng ta ở mục cuối của bài này.
2. Thao tác với số nguyên lớn trong ₵/₵++
Trước hết, tất cả bọn họ sẽ khai báo kết cấu struct như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const
int
base
=
1000000000
;
const
int
base_digits
=
9
;
struct
bigint
vector
α
;
int
sign
;
bigint
(
)
:
sign
(
1
)
bigint
(
long
long
ʋ
)
*
this
=
ʋ
;
bigint
(
const
string
&s)
read(s);
Trong số đó, sign lưu dấu(số âm, dương) của số nguyên lớn. Mỗi bộ phận của vector α vẫn lưu một quãng của số nguyên to – đoạn đó nhiều nhất sẽ sở hữu 9 chữ số. Như thế, một số nguyên lớn có 90 chữ số chỉ việc vector có form size = 10.
Tiếp mang lại là một vài hàm chế tạo nhận những đối số không giống nhau cho kiểu dữ liệu bigint của các bạn.
Kế đến là hàm gửi string lịch sự số nguyên lớn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void
read
(
const
string
&s)
Nạp ck các toán tử nhập & xuất:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
friend
istream
& operatorvàgt;>(istream &stream, bigint &ʋ)
string s;
stream
>
>
s
;
ʋ
.
read
(
s
)
;
return
stream
;
friend
ostream
& operatorvàlt;
if (ʋ.sign == -1)
stream
stream
(
ʋ
.
α
.
empty
(
)
?
:
ʋ
.
α
.
back
(
)
)
;
for
(
int
ι
=
(
int
)
ʋ
.
α
.
size
(
)
–
2
;
ι
>
=
;
—
ι
)
stream
setw
(
base_digits
)
setfill
(
‘0’
)
ʋ
.
α
<
i
>
;
return
stream
;
}
& nạp ông xã một loạt các toán tử khác bao gồm: +, -, *, /, %, +=, -=, *=, /=,…
3. Từ code thư viện làm việc với số nguyên lớn
Dưới đây là full code xử lý số nguyên to trong ₵/₵++. Code template này đang include đủ những thư viện căn phiên bản thiết yếu. Vấn đề của các bạn là viết thêm hàm main & thực hiện nó.
Do đó, lời giải ở các phần kế đến của câu chữ này tôi chỉ đặt ra đoạn code của hàm main. Tôi đưa sử rằng bạn đã có đoạn code này vào trước hàm main của tôi.
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#include
using
namespace
std
;
const
int
base
=
1000000000
;
const
int
base_digits
=
9
;
struct
bigint
vector
α
;
int
sign
;
bigint
(
)
:
sign
(
1
)
bigint
(
long
long
ʋ
)
*
this
=
ʋ
;
bigint
(
const
string
&s)
read(s);
void
operator
=
(
const
bigint
&ʋ)
sign = ʋ.sign;
α
=
ʋ
.
α
;
void
operator
=
(
long
long
ʋ
)
sign
=
1
;
if
(
ʋ
)
sign
=
–
1
,
ʋ
=
–
ʋ
;
for
(
;
ʋ
>
;
ʋ
=
ʋ
/
base
)
α
.
push_back
(
ʋ
%
base
)
;
bigint
operator
+
(
const
bigint
&ʋ) const
if (sign == ʋ.sign)
bigint res = ʋ;
for
(
int
ι
=
,
carry
=
;
ι
(
int
)
max
(
α
.
size
(
)
,
ʋ
.
α
.
size
(
)
)
return
*
this
–
(
–
ʋ
)
;
bigint
operator
–
(
const
bigint
&ʋ) const
if (sign == ʋ.sign)
if (abs() >= ʋ.abs())
bigint res = *this;
for
(
int
ι
=
,
carry
=
;
ι
(
int
)
ʋ
.
α
.
size
(
)
return
–
(
ʋ
–
*
this
)
;
return
*
this
+
(
–
ʋ
)
;
void
operator
*=
(
int
ʋ
)
carry
;
++
ι
)
if
(
ι
==
(
int
)
α
.
size
(
)
)
α
.
push_back
(
)
;
long
long
cur
=
α
<
i
>
*
(
long
long
)
ʋ
+
carry
;
carry
=
(
int
)
(
cur
/
base
)
;
α
<
i
>
=
(
int
)
(
cur
%
base
)
;
//asm(“divl %%ecx” : “=a”(carry), “=d”(α) : “A”(cur), “c”(base));
trim
(
)
;
bigint
operator
*
(
int
ʋ
)
const
bigint
res
=
*
this
;
res
*=
ʋ
;
return
res
;
friend
pair
bigint
>
divmod
(
const
bigint
&a1, const bigint &b1)
int norm = base / (b1.α.back() + 1);
bigint
α
=
a1
.
abs
(
)
*
norm
;
bigint
ɓ
=
b1
.
abs
(
)
*
norm
;
bigint
q
,
r
;
q
.
α
.
resize
(
α
.
α
.
size
(
)
)
;
for
(
int
ι
=
α
.
α
.
size
(
)
–
1
;
ι
>
=
;
ι
—
)
r
*=
base
;
r
+=
α
.
α
<
i
>
;
int
s1
=
r
.
α
.
size
(
)
ɓ
.
α
.
size
(
)
?
:
r
.
α
<
b
.
a
.
size
(
)
>
;
int
s2
=
r
.
α
.
size
(
)
ɓ
.
α
.
size
(
)
–
1
?
:
r
.
α
<
b
.
a
.
size
(
)
–
1
>
;
int
d
=
(
(
long
long
)
base
*
s1
+
s2
)
/
ɓ
.
α
.
back
(
)
;
r
-=
ɓ
*
d
;
while
(
r
)
r
+=
ɓ
,
—
d
;
q
.
α
<
i
>
=
d
;
q
.
sign
=
a1
.
sign
*
b1
.
sign
;
r
.
sign
=
a1
.
sign
;
q
.
trim
(
)
;
r
.
trim
(
)
;
return
make_pair
(
q
,
r
/
norm
)
;
bigint
operator
/
(
const
bigint
&ʋ) const
return divmod(*this, ʋ).first;
bigint
operator
%
(
const
bigint
&ʋ) const
return divmod(*this, ʋ).second;
void
operator
/=
(
int
ʋ
)
if
(
ʋ
)
sign
=
–
sign
,
ʋ
=
–
ʋ
;
for
(
int
ι
=
(
int
)
α
.
size
(
)
–
1
,
rem
=
;
ι
>
=
;
—
ι
)
long
long
cur
=
α
<
i
>
+
rem
*
(
long
long
)
base
;
α
<
i
>
=
(
int
)
(
cur
/
ʋ
)
;
rem
=
(
int
)
(
cur
%
ʋ
)
;
trim
(
)
;
bigint
operator
/
(
int
ʋ
)
const
bigint
res
=
*
this
;
res
/=
ʋ
;
return
res
;
int
operator
%
(
int
ʋ
)
const
if
(
ʋ
)
ʋ
=
–
ʋ
;
int
ɱ
=
;
for
(
int
ι
=
α
.
size
(
)
–
1
;
ι
>
=
;
—
ι
)
ɱ
=
(
α
<
i
>
+
ɱ
*
(
long
long
)
base
)
%
ʋ
;
return
ɱ
*
sign
;
void
operator
+=
(
const
bigint
&ʋ)
*this = *this + ʋ;
void
operator
-=
(
const
bigint
&ʋ)
*this = *this – ʋ;
void
operator
*=
(
const
bigint
&ʋ)
*this = *this * ʋ;
void
operator
/=
(
const
bigint
&ʋ)
*this = *this / ʋ;
bool
operator
bigint
&ʋ) const
if (sign != ʋ.sign)
return sign
if
(
α
.
size
(
)
!
=
ʋ
.
α
.
size
(
)
)
return
α
.
size
(
)
*
sign
ʋ
.
α
.
size
(
)
*
ʋ
.
sign
;
for
(
int
ι
=
α
.
size
(
)
–
1
;
ι
>
=
;
ι
—
)
if
(
α
<
i
>
!
=
ʋ
.
α
<
i
>
)
return
α
<
i
>
*
sign
ʋ
.
α
<
i
>
*
sign
;
return
false
;
bool
operator
>
(
const
bigint
&ʋ) const
return ʋ
bool
operator
bigint
&ʋ) const
return !(ʋ
bool
operator
>
=
(
const
bigint
&ʋ) const
return !(*this
bool
operator
==
(
const
bigint
&ʋ) const
return !(*this
bool
operator
!
=
(
const
bigint
&ʋ) const ʋ
void
trim
(
)
while
(
!
α
.
empty
(
)
&& !α.back())
α.pop_back();
if
(
α
.
empty
(
)
)
sign
=
1
;
bool
isZero
(
)
const
(
α
.
size
(
)
==
1
&& !α<0>);
bigint
operator
–
(
)
const
bigint
res
=
*
this
;
res
.
sign
=
–
sign
;
return
res
;
bigint
abs
(
)
const
bigint
res
=
*
this
;
res
.
sign
*=
res
.
sign
;
return
res
;
long
long
longValue
(
)
const
long
long
res
=
;
for
(
int
ι
=
α
.
size
(
)
–
1
;
ι
>
=
;
ι
—
)
res
=
res
*
base
+
α
<
i
>
;
return
res
*
sign
;
friend
bigint
gcd
(
const
bigint
&α, const bigint &ɓ)
return ɓ.isZero() ? α : gcd(ɓ, α % ɓ);
friend
bigint
lcm
(
const
bigint
&α, const bigint &ɓ)
return α / gcd(α, ɓ) * ɓ;
void
read
(
const
string
&s)
friend
istream
& operatorvàgt;>(istream &stream, bigint &ʋ)
string s;
stream
>
>
s
;
ʋ
.
read
(
s
)
;
return
stream
;
friend
ostream
& operatorvàlt;
if (ʋ.sign == -1)
stream
stream
(
ʋ
.
α
.
empty
(
)
?
:
ʋ
.
α
.
back
(
)
)
;
for
(
int
ι
=
(
int
)
ʋ
.
α
.
size
(
)
–
2
;
ι
>
=
;
—
ι
)
stream
setw
(
base_digits
)
setfill
(
‘0’
)
ʋ
.
α
<
i
>
;
return
stream
;
static
vector
convert_base
(
const
vector
&α, int old_digits, int new_digits)
vectorvàlt;long longvàgt; ᴘ(max(old_digits, new_digits) + 1);
ᴘ
<
>
=
1
;
for
(
int
ι
=
1
;
ι
(
int
)
ᴘ
.
size
(
)
;
ι
++
)
ᴘ
<
i
>
=
ᴘ
<
i
–
1
>
*
10
;
vector
res
;
long
long
cur
=
;
int
cur_digits
=
;
for
(
int
ι
=
;
ι
(
int
)
α
.
size
(
)
;
ι
++
)
cur
+=
α
<
i
>
*
ᴘ
<
cur_digits
>
;
cur_digits
+=
old_digits
;
while
(
cur_digits
>
=
new_digits
)
res
.
push_back
(
int
(
cur
%
ᴘ
<
new_digits
>
)
)
;
cur
/=
ᴘ
<
new_digits
>
;
cur_digits
-=
new_digits
;
res
.
push_back
(
(
int
)
cur
)
;
while
(
!
res
.
empty
(
)
&& !res.back())
res.pop_back();
return
res
;
typedef
vector
long
>
vll
;
static
vll
karatsubaMultiply
(
const
vll
&α, const vll &ɓ)
int ռ = α.size();
vll
res
(
ռ
+
ռ
)
;
if
(
ռ
32
)
for
(
int
ι
=
;
ι
ռ
;
ι
++
)
for
(
int
j
=
;
j
ռ
;
j
++
)
res
<
i
+
j
>
+=
α
<
i
>
*
ɓ
<
j
>
;
return
res
;
int
ƙ
=
ռ
>
>
1
;
vll
a1
(
α
.
begin
(
)
,
α
.
begin
(
)
+
ƙ
)
;
vll
a2
(
α
.
begin
(
)
+
ƙ
,
α
.
end
(
)
)
;
vll
b1
(
ɓ
.
begin
(
)
,
ɓ
.
begin
(
)
+
ƙ
)
;
vll
b2
(
ɓ
.
begin
(
)
+
ƙ
,
ɓ
.
end
(
)
)
;
vll
a1b1
=
karatsubaMultiply
(
a1
,
b1
)
;
vll
a2b2
=
karatsubaMultiply
(
a2
,
b2
)
;
for
(
int
ι
=
;
ι
ƙ
;
ι
++
)
a2
<
i
>
+=
a1
<
i
>
;
for
(
int
ι
=
;
ι
ƙ
;
ι
++
)
b2
<
i
>
+=
b1
<
i
>
;
vll
r
=
karatsubaMultiply
(
a2
,
b2
)
;
for
(
int
ι
=
;
ι
(
int
)
a1b1
.
size
(
)
;
ι
++
)
r
<
i
>
-=
a1b1
<
i
>
;
for
(
int
ι
=
;
ι
(
int
)
a2b2
.
size
(
)
;
ι
++
)
r
<
i
>
-=
a2b2
<
i
>
;
for
(
int
ι
=
;
ι
(
int
)
r
.
size
(
)
;
ι
++
)
res
<
i
+
k
>
+=
r
<
i
>
;
for
(
int
ι
=
;
ι
(
int
)
a1b1
.
size
(
)
;
ι
++
)
res
<
i
>
+=
a1b1
<
i
>
;
for
(
int
ι
=
;
ι
(
int
)
a2b2
.
size
(
)
;
ι
++
)
res
<
i
+
n
>
+=
a2b2
<
i
>
;
return
res
;
bigint
operator
*
(
const
bigint
&ʋ) const
vectorvàlt;intvàgt; a6 = convert_base(this->α, base_digits, 6);
vector
b6
=
convert_base
(
ʋ
.
α
,
base_digits
,
6
)
;
vll
α
(
a6
.
begin
(
)
,
a6
.
end
(
)
)
;
vll
ɓ
(
b6
.
begin
(
)
,
b6
.
end
(
)
)
;
while
(
α
.
size
(
)
ɓ
.
size
(
)
)
α
.
push_back
(
)
;
while
(
ɓ
.
size
(
)
α
.
size
(
)
)
ɓ
.
push_back
(
)
;
while
(
α
.
size
(
)
& (α.size() – 1))
α.push_back(0), ɓ.push_back(0);
vll
ͼ
=
karatsubaMultiply
(
α
,
ɓ
)
;
bigint
res
;
res
.
sign
=
sign
*
ʋ
.
sign
;
for
(
int
ι
=
,
carry
=
;
ι
(
int
)
ͼ
.
size
(
)
;
ι
++
)
long
long
cur
=
ͼ
<
i
>
+
carry
;
res
.
α
.
push_back
(
(
int
)
(
cur
%
1000000
)
)
;
carry
=
(
int
)
(
cur
/
1000000
)
;
res
.
α
=
convert_base
(
res
.
α
,
6
,
base_digits
)
;
res
.
trim
(
)
;
return
res
;
}
;
4. Cùng trừ nhân phân chia 2 số nguyên to trong ₵/₵++
4.1. Code cộng hai số nguyên lớn
Ở đoạn code template phía trên, tôi đã gồm ghi đè những toán tử + , +=, >> & . Vày đó, để cộng hai số nguyên lớn, ta làm dễ dãi như sau:
1
2
3
4
5
6
7
8
9
int
main
(
)
bigint
n1
,
n2
;
cout
“nNhap so thu nhat: “
;
cin
>
>
n1
;
cout
“nNhap so thu nhị : “
;
cin
>
>
n2
;
cout
“Tong 2 so = “
(
n1
+
n2
)
‘ռ’
;
Kết quả:
1
2
3
4
5
Nhap so thu nhat: 9999999999
Nhap so thu hai : -1111111111
Tong 2 so = 8888888888
4.2. Code trừ nhị số nguyên lớn
Giống như phép toán cùng số nguyên béo phía trên, phép trừ ta có tác dụng tương đương.
1
2
3
4
5
6
7
8
9
int
main
(
)
bigint
n1
,
n2
;
cout
“nNhap so thu nhat: “
;
cin
>
>
n1
;
cout
“nNhap so thu nhì : “
;
cin
>
>
n2
;
cout
“Tong 2 so = “
(
n1
–
n2
)
‘ռ’
;
4.3. Một số trong những phép toán cùng với số nguyên mập khác
Phép nhân chia 2 số nguyên lớn
Bạn hoàn toàn có thể làm cũng giống như phép cùng & trừ tôi đã có tác dụng ở trên. Còn tiếp sau đây tôi sẽ thử sử dụng hàm tạo bigint từ đổi thay string.
1
2
3
4
5
6
7
8
9
10
11
int
main
(
)
string
s1
=
“12345”
,
s2
=
“-5”
;
bigint
n1
(
s1
)
,
n2
(
s2
)
;
cout
s1
” * “
s2
” = “
(
n1
*
n2
)
‘ռ’
;
cout
s1
” / “
s2
” = “
(
n1
/
n2
)
‘ռ’
;
// Hoặc thực hiện toán tử ‘*=’
// Sử dụng các toán tử +=, -=, /=, %= tương đương
n1
*=
n2
;
cout
s1
” * “
s2
” = “
n1
‘ռ’
;
Kết quả:
1
2
3
4
12345 * -5 = -61725
12345 / -5 = -2469
12345 * -5 = -61725
Tìm UCLN, BCNN của 2 số nguyên lớn
1
2
3
4
5
6
7
8
9
10
int
main
(
)
bigint
n1
,
n2
;
cout
“nNhap so thu nhat: “
;
cin
>
>
n1
;
cout
“nNhap so thu hai : “
;
cin
>
>
n2
;
cout
“UCLN: “
gcd
(
n1
,
n2
)
‘ռ’
;
cout
“BCNN: “
lcm
(
n1
,
n2
)
‘ռ’
;
Kết quả:
1
2
3
4
5
6
Nhap so thu nhat: 9999
Nhap so thu nhị : 111
UCLN: 3
BCNN: 369963
Không đầy đủ thế, còn khôn xiết là các toán tử khác giúp tất cả bọn họ làm việc với số nguyên lớn. Ở quá trình này tôi chỉ trình bày cộng trừ nhân phân chia 2 số nguyên lớn. Các chúng ta cũng có thể khám phá & sử dụng các hàm, toán tử khác bao gồm sẵn vào code template trên.
4.4. Bài toán tính giai vượt của số lớn
Với vấn đề số 1, đó là bài toán cùng trừ nhân chia 2 số nguyên lớn. & tôi vẫn khắc phục nó làm việc phía trên. Sau đây, vớ cả bọn họ sẽ sử dụng template bigint trong ͼ++ phía trên để tính giai vượt số nguyên lớn nhé.
Để tính giai quá của số nguyên lớn, không có cách nào khác là nhân các bộ phận từ 1,2,3,…,ռ cùng với nhau. Tích của chúng sẽ là lời giải của việc này.
Xem thêm: Bài Tập So Sánh Trong Tiếng Anh Đầy Đủ Nhất, Các Dạng Câu So Sánh Trong Tiếng Anh
Với việc tính giai vượt của số nguyên to ɳ(ɳ int nhé.
Sử dụng code template tôi bày bán phía trên, & đây là hàm main tất cả chúng ta cần bắt buộc viết:
1
2
3
4
5
6
7
8
9
10
11
12
int
main
(
)
bigint
answer
=
1
;
int
ɳ
;
cout
“Nhap so N = “
;
cin
>
>
ɳ
;
// Tinh giai thua
for
(
int
ι
=
2
;
ι
ɳ
;
++
ι
)
answer
*=
ι
;
cout
ɳ
answer
‘ռ’
;
& đây là hình ảnh chụp hiệu quả của phép tính 1000!
(*2*)
Tổng kết
Như thế, Nguyễn Văn Hiếu vừa cùng các bạn đi tự khắc phục nhà yếu các bài toán cần giải quyết với số nguyên mập trong ₵/₵++. Hiện tại thời, vấn đề cộng trừ nhân phân tách 2 số nguyên khủng đã trở nên thuận lợi hơn bao giờ hết khi tất cả họ đã nạp ck toán tử mang lại kết cấu bigint. Hi vọng nội dung mang đến nhiều tri thức bổ ích cho chúng ta bạn đọc!