📌  相关文章
📜  给定大量数字,请检查数字的子序列是否可被8整除(1)

📅  最后修改于: 2023-12-03 15:27:34.783000             🧑  作者: Mango

给定大量数字,请检查数字的子序列是否可被8整除

介绍

本文将介绍一种检查数字子序列是否可被8整除的算法。给定一个大量数字的数组,可在O(n)时间复杂度内完成检查。我们将通过以下内容来实现该算法:

  1. 分析判定8的条件;
  2. 建立状态数组;
  3. 遍历大量数字数组,并更新状态数组;
  4. 返回判断结果。
判定8的条件

数字能够被8整除的条件是:该数字的后三位能被8整除。因此,我们将建立一个状态数组,来记录数字串从后往前的三位是否能被8整除。

建立状态数组

我们建立一个长度为8的状态数组,表示数字在除以8的余数。则对于数字d:

  • 如果d % 8 的余数为r,则r标记在状态数组中;
  • 如果数字d的后两位可以被8整除,则将状态数组的第0位标记。

下面是状态数组的建立代码:

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,我们需要:

  1. 更新状态数组,表示余数为d%8;
  2. 如果数字d的后两位可以被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]--;
    }
    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)时间复杂度内能够完成检查,能够应用于大量数字的情况。