当前位置: 首页 > 面试题库 >

C语言中的Python风格整数除法和模数

轩辕经赋
2023-03-14
问题内容

在Python和Ruby中,有符号整数除法会截断为负无穷大,而有符号整数模数的第二个操作数具有相同的符号:

>>> (-41) / 3
-14
>>> (-41) % 3
1

但是,在C和Java中,有符号整数除法将截断为0,并且有符号整数模数与第一个操作数具有相同的符号:

printf("%d\n", (-41) / 3); /* prints "-13" */
printf("%d\n", (-41) % 3); /* prints "-2" */

用C语言执行与Python和Ruby中相同的除法和模数的最简单,最有效的方法是什么?


问题答案:

在较旧的C标准中没有指定带符号整数除法的舍入方向。但是,在C99中指定将其舍入为零。

这是可移植的代码,适用于所有版本的C标准和CPU架构:

int py_div(int a, int b)
{
  if (a < 0)
    if (b < 0)
      return -a / -b;
    else
      return -(-a / b) - (-a % b != 0 ? 1 : 0);
  else if (b < 0)
      return -(a / -b) - (a % -b != 0 ? 1 : 0);
    else
      return a / b;
}

int py_mod(int a, int b)
{
  if (a < 0)
    if (b < 0)
      return -(-a % -b);
    else
      return -a % b - (-a % -b != 0 ? 1 : 0);
  else if (b < 0)
      return -(a % -b) + (-a % -b != 0 ? 1 : 0);
    else
      return a % b;
}

我做了一些表面测试,结果似乎和Python一样。该代码可能没有最大效率,但是一个好的C编译器可能会充分优化它,特别是如果将代码作为静态函数放在标头中。



 类似资料:
  • 本文档修改于 AT&T Indian Hill 实验室内部成立的一个委员会的一份文档,旨在于建立一套通用的编码标准。

  • 主要内容:整型的长度,sizeof 操作符,不同整型的输出整数是编程中常用的一种数据,C语言通常使用 来定义整数(int 是 integer 的简写),这在《 大话C语言变量和数据类型》中已经进行了详细讲解。 在现代操作系统中,int 一般占用 4 个字节(Byte)的内存,共计 32 位(Bit)。如果不考虑正负数,当所有的位都为 1 时它的值最大,为 2 32-1 = 4,294,967,295 ≈ 43亿,这是一个很大的数,实际开发中很少用到,而诸

  • 你可能已经想知道如何将你放在*.vue文件中的代码检查风格了,尽管它们不是JavaScript。我们将假设你正在使用ESLint(如果你还没用,那你应该用了!)。 你还需要[eslint-plugin-html](https://github.com/BenoitZugmeyer/eslint-plugin-html),它支持在 *.vue 文件中提取和删除JavaScript。 确保在ESLin

  • 问题内容: 当我在Python 3.3.0中输入这些表达式时出现问题 好像需要大约浮点数(-3.33)?并在整数除法中四舍五入,但是在模运算中它做的事情完全不同。似乎它返回余数+/- 1并仅根据负操作数所在的位置切换符号。即使在查看本网站上的其他答案之后,我也完全感到困惑!我希望有人也能清楚地解释这一点!这本书说出了一些提示:回想一下这个神奇的公式a =(a // b)(b)+(a%b),但这似乎

  • 本文向大家介绍C语言中的abs()函数和exp()函数的用法,包括了C语言中的abs()函数和exp()函数的用法的使用技巧和注意事项,需要的朋友参考一下 C语言abs()函数:求绝对值(整数) 头文件: 定义函数: 函数说明:abs()用来计算参数j 的绝对值,然后将结果返回。 返回值:返回参数j 的绝对值结果。 范例 执行 C语言exp()函数:e的次幂函数(以e为底的x次方值) 头文件: e

  • 我有一个很难处理的任务。 我试图编写一个递归函数(完全没有循环),给定一个数组及其长度,它将打印一对子数组,每个子数组的和将是整个数组和的一半。换句话说,数组被分成两组整数,以便它们的和相等。 例如,给定数组{1,2,2,0,5},函数应输出{1,2,2}{0,5} 我必须递归地做,用一个只得到数组本身及其大小的函数。我也只允许使用一个额外的递归函数来解决这个问题。 任何想法或想法都将受到最大的赞