将数字除以3而不使用*,/,+,

如何将数字除以3而不使用*/+-% ,运算符?

该号码可以是有符号的或无符号的。


这是一个执行所需操作的简单功能。 但它需要+运算符,所以你只需要用位运算符来添加值:

// replaces the + operator
int add(int x, int y)
{
    while (x) {
        int t = (x & y) << 1;
        y ^= x;
        x = t;
    }
    return y;
}

int divideby3 (int num)
{
    int sum = 0;
    while (num > 3) {
        sum = add(num >> 2, sum);
        num = add(num >> 2, num & 3);
    }
    if (num == 3)
        sum = add(sum, 1);
    return sum; 
}

吉姆评论这件作品是因为:

  • n = 4 * a + b
  • n / 3 = a + (a + b) / 3
  • So sum += a, n = a + b ,并迭代

  • a == 0 (n < 4)sum += floor(n / 3); 即1, if n == 3, else 0


  • 贫乏的条件需要一个愚蠢的解决方案:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        FILE * fp=fopen("temp.dat","w+b");
        int number=12346;
        int divisor=3;
        char * buf = calloc(number,1);
        fwrite(buf,number,1,fp);
        rewind(fp);
        int result=fread(buf,divisor,number,fp);
        printf("%d / %d = %d", number, divisor, result);
        free(buf);
        fclose(fp);
        return 0;
    }
    

    如果还需要小数部分,只需将result声明为double并将其添加到fmod(number,divisor)的结果中即可。

    它是如何工作的解释

  • fwrite写入number字节(上例中的数字为123456)。
  • rewind将文件指针重置为文件的前端。
  • fread最大的读取number是“记录” divisor在从文件长度,并将其返回读出元件的数目。
  • 如果你写了30个字节,然后以3为单位读回文件,你会得到10个“单位”。 30/3 = 10


    log(pow(exp(number),0.33333333333333333333)) /* :-) */
    
    链接地址: http://www.djcxy.com/p/6345.html

    上一篇: Divide a number by 3 without using *, /, +,

    下一篇: Marching Cube Ambiguities Versus Marching Tetrahedron