Melaksanakan Integer Panjang Arbitrari dalam C
Apabila berhadapan dengan tugas mengendalikan nombor yang melebihi kapasiti int panjang biasa, ramai pengaturcara menggunakan pelaksanaan sumber terbuka sedia ada. Walau bagaimanapun, cabaran untuk mencipta kelas BigInt tersuai anda sendiri menawarkan cerapan berharga tentang kerumitan operasi berangka.
Pendekatan
Pendekatan asas untuk pelaksanaan BigInt melibatkan mewakili nombor sebagai rentetan, memecahkannya kepada digit yang lebih kecil (cth., digit tunggal), dan menyimpannya dalam tatasusunan. Ini membolehkan pelaksanaan mudah bagi pengendali perbandingan. Cabarannya terletak pada melaksanakan operasi yang lebih kompleks seperti penambahan dan pendaraban.
Tambahan
Untuk melakukan penambahan, kami meniru operasi binari yang digunakan oleh CPU. Setiap elemen tatasusunan nilai BigInt ditambah, dengan sebarang limpahan dibawa ke elemen seterusnya. Sebagai contoh, pertimbangkan = pelaksanaan operator:
BigInt& operator+=(const BigInt& operand) { BT count, carry = 0; for (count = 0; count < std::max(value_.size(), operand.value_.size()); count++) { BT op0 = count < value_.size() ? value_.at(count) : 0, op1 = count < operand.value_.size() ? operand.value_.at(count) : 0; BT digits_result = op0 + op1 + carry; if (digits_result - carry < std::max(op0, op1)) { BT carry_old = carry; carry = digits_result; digits_result = (op0 + op1 + carry) >> sizeof(BT) * 8; // NOTE [1] } else carry = 0; } return *this; }
Pendaraban
Pendaraban boleh dilakukan menggunakan penambahan berulang. Sebagai alternatif, algoritma yang cekap seperti kaedah Karatsuba boleh digunakan.
Pertimbangan Tambahan
Kelas BigInt harus menyediakan operator standard seperti operator<< untuk operator peralihan dan perbandingan seperti operator<. Berkawan dengan std::ostream operator<< membolehkan keluaran yang mudah. Pengoptimuman boleh dibuat untuk meningkatkan kecekapan, seperti menyemak bilangan digit dengan saiz() sebelum melakukan perbandingan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Integer Panjang Arbitrari dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!