📅  最后修改于: 2023-12-03 15:27:34.783000             🧑  作者: Mango
本文将介绍一种检查数字子序列是否可被8整除的算法。给定一个大量数字的数组,可在O(n)时间复杂度内完成检查。我们将通过以下内容来实现该算法:
数字能够被8整除的条件是:该数字的后三位能被8整除。因此,我们将建立一个状态数组,来记录数字串从后往前的三位是否能被8整除。
我们建立一个长度为8的状态数组,表示数字在除以8的余数。则对于数字d:
下面是状态数组的建立代码:
int state[8] = {0};
for(int i=0; i<n; i++){
int r = a[i] % 8;
state[r]++;
if(a[i] >= 100 && a[i] % 100 == 0){
state[0]++;
}
}
我们需要遍历大量数字数组,对每个数字进行处理。对于数字d,我们需要:
下面是遍历数字数组的代码:
for(int i=0; i<n; i++){
int r = a[i] % 8;
state[r]--;
if(a[i] >= 100 && a[i] % 100 == 0){
state[0]--;
}
if(state[r] < 0){
state[r] += 8;
}
if(state[0] < 0){
state[0] += 8;
}
}
在遍历完大量数字数组后,状态数组的第0位的值就是大量数字的子序列能否被8整除的结果。如果状态数组第0位的值为0,则表示大量数字的子序列能被8整除。下面是判断最终结果的代码:
if(state[0] == 0){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
本文介绍了一种检查数字子序列是否可被8整除的算法,通过建立状态数组,每次遍历数字时,更新状态数组,最终判断状态数组第0位的值,来实现检查。该算法在O(n)时间复杂度内能够完成检查,能够应用于大量数字的情况。