将数字除以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