检查号码的逻辑可以被3整除吗?

kar*_*hik 3 c math

不使用%,/或*,我必须找到否.可以被3整除吗?

这可能是一个面试问题.

谢谢.

orl*_*rlp 11

有各种方式.最简单的是非常明显的:

int isdivby3(int n) {
    if (n < 0) n = -n;

    while (n > 0) n -= 3;

    return n == 0;
}
Run Code Online (Sandbox Code Playgroud)

但我们可以改善这一点.任何数字都可以这样表示:(","表示包括范围):

Base2 (AKA binary)
(0,1) + 2*(0,1) + 4*(0,1)

Base4
(0,3) + 4*(0,3) + 16*(0,3)

BaseN
(0,N-1) + N*(0,N-1) + N*N*(0,N-1)
Run Code Online (Sandbox Code Playgroud)

现在的诀窍是,当且仅当基数的digitum x可被整除时,数字n-1才能被整除.这个技巧以9为人所熟知:xnn-1

1926 = 6 + 2*10 + 9*100 + 1*1000
6+2+9+1 = 8 + 1*10
8+1 = 9 thus 1926 is divisible by 9
Run Code Online (Sandbox Code Playgroud)

现在我们也可以在base4中应用3.幸运的是,因为4是2的幂,我们可以进行二进制按位运算.我用的是符号number(base).

27(10) = 123(4)
Digitsum
12(4)
Digitsum again
3(4) = Divisible!
Run Code Online (Sandbox Code Playgroud)

现在让我们把它翻译成C:

int div3(int n) {
    if (n < 0) n = -n;
    else if (n == 0) return 1;

    while (n > 3) {
        int d = 0;

        while (n > 0) {
            d += n & 3;
            n >>= 2;
        }

        n = d;
    }

    return n == 3;
}
Run Code Online (Sandbox Code Playgroud)

快速燃烧.


kar*_*hik 10

减去3直到你

命中0 - 数字可以被3(或)整除

得到一个小于0的数字 - 数字不可分割

 if (number > 0)
 {
        while (number > 0)
        {
            number -= 3;
    }
}
else if( number < 0)
{
    while number < 0:
        number += 3
}
return number == 0
Run Code Online (Sandbox Code Playgroud)


bti*_*lly 6

这是一个相当有效的大数字算法.(不是很有效,但考虑到约束,这是合理的.)

使用sprintf将其转换为字符串,每个数字转换回数字.加上数字.如果你想出3,6或9,它可以被3整除.除了10以外的任何其他东西,它不是.任何超过9的,递减.

例如,为了测试数字813478902你要字符串化,然后添加数字得到42,添加这些数字得到6,所以它可以被3整除.

  • @nightcracker:问题说没有使用那些运算符,它没有说没有使用*大概*是使用那些运算符实现的标准函数,但未指定为这样.对于可以调用标准库的sub-C编译器来说,这将是一个非常合理的答案,但是它自己的`%/*`运算符被神秘地破坏了.反对-1的+1,我认为如果面试官施加不切实际的限制,那么他们应该期待狡猾的答案,并且应该有更具体的限制准备的后续问题. (2认同)