为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

你会如何除以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; 

}

正如Jim所说的,这是可行的,因为:


n = 4 * a + b

n / 3 = a + (a + b) / 3

所以sum += a,n = a + b和迭代


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


查看完整回答
反对 回复 2019-10-12
?
牧羊人nacy

惯用条件需要惯用的解决方案:


#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;

}

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


解释如何运作


的fwrite写入number字节(序号为在示例123456段)。

rewind 将文件指针重置为文件的开头。

fread从文件中读取最大长度的number“记录” divisor,并返回其读取的元素数。

如果您写入30个字节,然后以3为单位回读文件,则将获得10个“单位”。30/3 = 10


查看完整回答
反对 回复 2019-10-12
?
123456qqq

您可以使用(取决于平台的)内联汇编,例如,对于x86 :(也适用于负数)


#include <stdio.h>


int main() {

  int dividend = -42, divisor = 5, quotient, remainder;


  __asm__ ( "cdq; idivl %%ebx;"

          : "=a" (quotient), "=d" (remainder)

          : "a"  (dividend), "b"  (divisor)

          : );


  printf("%i / %i = %i, remainder: %i\n", dividend, divisor, quotient, remainder);

  return 0;

}


查看完整回答
反对 回复 2019-10-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信