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!