Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengendalikan Nombor Negatif dalam Aritmetik Modular untuk Pengindeksan Tatasusunan yang Betul?
Aritmetik Modular dan Indeks Negatif
Operasi modulo standard (%) pada integer negatif boleh menghasilkan hasil yang tidak dijangka apabila digunakan untuk pengindeksan tatasusunan. Bakinya boleh negatif, membawa kepada nilai indeks tidak sah. Untuk memastikan indeks tatasusunan positif yang betul, kami memerlukan fungsi modulo yang diubah suai.
Penyelesaian biasa ialah menggunakan formula ini:
<code>GetArrayIndex(i, arrayLength) = (i % arrayLength + arrayLength) % arrayLength</code>
Ini menjamin indeks positif dalam julat [0, arrayLength - 1], tanpa mengira input i
's sign.
Fungsi Modulo Tersuai
Untuk kod yang lebih bersih, fungsi mod
tersuai berguna:
<code class="language-java">public static int mod(int x, int m) { return (x % m + m) % m; }</code>
Fungsi ini mengendalikan baki negatif dengan menambahkan m
untuk memastikan hasil yang positif.
Fungsi Modulo Dioptimumkan
Untuk kecekapan yang lebih baik (operasi modulo yang lebih sedikit), pertimbangkan alternatif ini:
<code class="language-java">public static int mod(int x, int m) { int r = x % m; return r < 0 ? r + m : r; }</code>
Versi ini terus menyemak sama ada baki r
adalah negatif, menambah m
hanya apabila perlu.
Contoh
Menggunakan sama ada fungsi mod
tersuai, kami mendapat kelakuan indeks tatasusunan yang dijangkakan:
GetArrayIndex(4, 3) == 1
GetArrayIndex(3, 3) == 0
GetArrayIndex(2, 3) == 2
GetArrayIndex(1, 3) == 1
GetArrayIndex(0, 3) == 0
GetArrayIndex(-1, 3) == 2
GetArrayIndex(-2, 3) == 1
GetArrayIndex(-3, 3) == 0
GetArrayIndex(-4, 3) == 2
Atas ialah kandungan terperinci Bagaimana Mengendalikan Nombor Negatif dalam Aritmetik Modular untuk Pengindeksan Tatasusunan yang Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!