你会如何除以3为数字,没有使用*,/,+,-,%,运营商?
号码可以是签名或未签名.
在Python和Ruby中,带符号的整数除法向负无穷大截断,有符号整数模数与第二个操作数具有相同的符号:
>>> (-41) / 3
-14
>>> (-41) % 3
1
Run Code Online (Sandbox Code Playgroud)
但是,在C和Java中,带符号的整数除法截断为0,有符号整数模数与第一个操作数的符号相同:
printf("%d\n", (-41) / 3); /* prints "-13" */
printf("%d\n", (-41) % 3); /* prints "-2" */
Run Code Online (Sandbox Code Playgroud)
在C和Python中执行相同类型的除法和模数的最简单,最有效的方法是什么?
在C,C++(stdlib.h)中有一个名为div的函数
div_t div(int numer, int denom);
typedef struct _div_t
{
int quot;
int rem;
} div_t;
Run Code Online (Sandbox Code Playgroud)
但是C,C++有/和%运算符.
我的问题是:" 当有/和%运算符时,div函数有用吗?"
如" 在C++中使用负数进行整数除法 "中所述,在C99之前的C中(即在C89中)和在C++之前的C++中(即在C++ 98和C++ 03中),用于整数除法计算,其中两个操作数都是负数,余数的符号(或等效地,商的舍入方向)是实现定义的.
然后是标准函数std::div,它被指定为将商截断为零(即,余数与被除数(分子)具有相同的符号)(例如,参见"div()库函数的目的是什么?"的答案.
这是glibc的div()(源代码)代码(也引用" Is div function useful(stdlib.h)? "):
(注:div_t定义为:
typedef struct
{
int quot;
int rem;
} div_t;
Run Code Online (Sandbox Code Playgroud)
- 结束说明.)
/* Return the `div_t' representation of NUMER over DENOM. */
div_t
div (numer, denom)
int numer, denom;
{
div_t result;
result.quot = numer / denom;
result.rem = numer % denom;
/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where …Run Code Online (Sandbox Code Playgroud) C++标准提供div(int,int),但不提供udiv(unsigned int,unsigned int).
如果我天真地在这个函数中使用无符号整数,我可以看到这会对分子中大于2 ^ 31 - 1的整数产生错误的结果.例如(带有4位半字节):
最大的4位半字节是15,1111二进制.作为有符号的半字节,这将代表-1.将15除以2得到7或0111,但将-1除以2得到0:0000.
是否有一种直接的方法来将div调整为无符号整数,或者我最好是编写自己的udiv,还是完全避免使用div和div类函数?
编辑/注意:在我的情况下,我正在使用unsigned long long ints,所以使用lldiv并不能解决问题.
我必须构建一个方法来添加参数中给出的字符串的每个数字,直到只剩下1位数,例如1234 = (1+2+3+4) = 10 = (1+0) = 1.
起初,我认为递归调用或while循环应该没问题.但有更聪明的方法吗?也许使用模数?
1234 % 9 = 1这似乎有效...但不是:9%9不等于,9但它是0.
有没有办法在没有递归/ for/while的情况下构建这个函数?
我今天在我的CS课上参加了一个测验并得到了关于模运算符错误的问题,因为我不知道C中%的可用性,我一直在使用fmod().为什么两者都存在?是一个更好/更快还是只处理不同的数据类型?