C语言 取模运算 保证正数,c语言的取模运算

我们对C的%运算知多少呢?

当是正整数时,可能大家都知道。例如:5%3等于2, 3%5等于3。

当存在负数时呢?先看看例子:

例一:

int main()

{

int x;

x = -6%5; printf("%2d/n",x);

x = 6%-5; printf("%2d/n",x);

x = 1%-5; printf("%2d/n",x);

x = -1%-5; printf("%2d/n",x);

x = -6%-5; printf("%2d/n",x);

}

运行结果为:

-1

1

1

-1

-1

例二:

#include int main()

{

int x;

x = 5%-6; printf("%2d/n",x);

x = -5%6; printf("%2d/n",x);

x = 4%5;   printf("%2d/n",x);

x = -4%-5; printf("%2d/n",x);

x = -5%-6; printf("%2d/n",x);

}

运行结果为:

5

-5

4

-4

-5

你看出规律了吗?我帮你总结一下:

余数的定义:当被除数不够整除时余下的数。

当都是正整数时:除法实际可转化为减数,不够减时剩下的就是余数。

例如:12%5

12-5-5

2

当存在负数时: x%y

i. 当异号时:                 if |x|>|y|

result: x+y

else

result: x

例:

-6% 5等于-1

6%-5等于 1

5%-6等于 5

-5% 6等于 -5

ii. 当同号时:                if |x|>|y|

result: x-y

else

result: x

例:

-1%-5等于-1

-6%-5等于-1

-4%-5等于-4

-5%-6等于-5

相信当你记住这个规律后,再遇到这种问题,你不用思考就可以回答出来。

但你一定不会满意,因为这不是你想要的结果,你一定觉得还有更深层的

原因。如果你感兴趣,请接着看:

例三:

#include int main()

{

int x;

x = -6/5; printf("%2d/n",x);

x = 6/-5; printf("%2d/n",x);

x = 1/-5; printf("%2d/n",x);

x = -1/-5; printf("%2d/n",x);

x = -6/-5; printf("%2d/n",x);

}

运行结果:

-1

-1

0

0

1

例四:

#include int main()

{

int x;

x = 5/-6; printf("%2d/n",x);

x = -5/6; printf("%2d/n",x);

x = 4/5;   printf("%2d/n",x);

x = -4/-5; printf("%2d/n",x);

x = -5/-6; printf("%2d/n",x);

}

运行结果:

0

0

0

0

0

这两个例子我想大家都觉得很简单,但简单并不代表它没价值,

特别是它和其它事物联系其来时你才会注意到。

“/”在我们这些程序中代表整除,它符合除法法则,异号抵消。

再看看我们余数的定义:

整除“余”下的“数”。则有:余数=被除数-商*除数商就是我们整除的结果。

看例子:

eg1:

(-6%5) = -6 - (-6/5)*5

(-6%5) = -6 - (-1)*5

(-6%5) = -6 - (-5)

(-6%5) = -6+5

(-6%5) = -1

eg2:

(5%-6) =   5 - (5/-6)*(-6)

(5%-6) =   5 - (0)*(-6)

(5%-6) =   5 - 0

(5%-6) =   5

eg3:

(-5%-6)= -5 - (-5/-6)*(-6)

(-5%-6)= -5 - (0)*(-6)

(-5%-6)= -5 - 0

(-5%-6)= -5

eg4:

(6%-5) =   6 - (6/-5)*(-5)

(6%-5) =   6 - (-1)*(-5)

(6%-5) =   6 - 5

(6%-5) =   1

到现在为止,你还有什么疑惑?

但我还是有点不明白,这是数学中的定义吗?

我查了一下《Concrete Mathematics》,请看原文:

摘之 P82

------------------

3.4 ‘MOD': THE BINARY OPERATION

The quotient of n divided by m is [n/m],when m and n are positive

integers. It's handy to have a simple notation also for the remainder

of this division, and we call it 'n mod m', The basic formula

n = m[n/m]+ n mod m

//NOTE:"m[n/m]" is quotient, "n mod m" is remainder

tells us that we can express n mod m as n-m[n/m] .We can generalize this

to megative integers, and in fact to arbitrary real numbers:

x mod y = x - y[x/y], for y!=0.

--------------------

从文中可能看出,数学中的 余数(remainder) 其实就是 取模(mod),即:

x mod y = x%y

x%y     = x - y[x/y], for y!=0.

数学中的余数概念和我们的计算机中的余数概念一致,但实现却不一致。

其中 [x/y] 代表的是 x/y 的最小下界。

例:

-3 mod 2         = -3 - 2*[-3/2]

= -3 - 2*[-1.5]

= -3 - 2*(-2)

= -3 + 4

= 1

而我们的计算机是怎么做的呢:

-3%2        = -3 - 2*(-3/2)

= -3 - 2*(-1)

= -3 - (-2)

= -1

所以计算机中的取余实际上是:

x%y = x - y(x/y), for y!=0.

这就是二者的区别。这个区别,对于正数,二者计算出的结果是相等的,但是负数就不相等了。这就意味着,如果以后在使用数学中余数相关定理的时候,要注意计算机中余数的计算和数学定义不是完全一致的,所以在计算机上,对于负数,数学定理并不完全适用。当然,对于正数,二者是没有区别的。至于为什么计算机上要这么实现,我想恐怕还是历史原因,最早的计算机如果这样计算除法(取余是靠除法来完成的),那么就涉及到浮点数的计算以及取下界,这样,将比较大的降低效率,所以实现成了这样的方式,一直沿用至今。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统上机题目(多线程2)

主线程创建4个子线程T1、T2、T3、T4&#xff0c;主线程在4个子线程退出后&#xff0c;才退出线程T1、T2、T3、T4的运行时代码如下&#xff1a; #include <unistd.h> // sleep函数声明在该头文件中void *T1_entry(void *arg) {sleep(2); // 睡眠2秒&#xff0c;不准删除…

图形GUI名称

15句柄图形(Handle Graphics)15.1图形窗的产生和控制(Figure window creation and control)clf 清除当前图close 关闭图形figure 打开或创建图形窗口gcf 获得当前图的柄openfig 打开图形refresh 刷新图形shg 显示图形窗15.2轴的产生和控制(Axis creation and control)axes 在任…

c语言编程非线性方程求解,c语言计算机编程三种方法求解非线性方程.doc

c语言计算机编程三种方法求解非线性方程.doc本 科 专 业 学 年 论 文题 目非线性方程求解比较姓 名 何 娟 专 业 计算机科学技术系 班 级 08 级本科(2)班 指 导 老 师 刘 晓 娜 完成日期 2010 年 11 月 21 日计算机学年专业论文 非线性方程求解- 1 -题 目非线性方程求解比较摘 …

最近用到这个强大的工具 PhysicsEditor (转)

今天收到PhysicsEditor作者发过来的license key&#xff0c;所以顺便把PhysicsEditor也尝试了一下。主要是尝试将PhysicsEditor与cocos2dx&#xff0c;box2d结合开发的一些步骤。之前大概网络检索了一下&#xff0c;知道PhysicsEditor的功能其实很简单。一句话就是给图片的边缘…

浅谈块级元素和内联元素的嵌套规则

1. 替换和不可替换元素 从元素本身的特点来讲&#xff0c;可以分为替换和不可替换元素。 a) 替换元素 替换元素就是浏览器根据元素的标签和属性&#xff0c;来决定元素的具体显示内容。 例如浏览器会根据<img>标签的src属性的值来读取图片信息并显示出来&#xff0c;而如…

如何更新Chrome

在浏览器的地址栏中输入chrome://help即可进行自动更新&#xff0c;如下图&#xff1a;

c语言用指针实现打开和关闭文件,我用rewind函数没把指针直到开始,关闭文件然后打开就行。帮忙看看...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼高手啊&#xff0c;我试了&#xff0c;结果是回到文件头了&#xff0c;把123覆盖了&#xff0c;为ABC 但我这个程序就能直接不关闭文件而用rewind函数到开头&#xff0c;你帮忙看看&#xff0c; //二进制文件的输入输出--数据块的读…

最佳适应算法模拟内存分配

最佳适应算法 从全部空闲区中找出能满足作业要求的&#xff0c;且大小最小的空闲分区&#xff0c;这种方法能使碎片尽量小。 问题描述 Given five memory partitions of 100 KB, 500 KB, 200 KB, 300 KB, and 600 KB (in order), how would each of the first-fit, best-fit…

单片机c语言 i%3c%3c1,单片机C语言作业及上机习题及答案

《单片机C语言作业及上机习题及答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《单片机C语言作业及上机习题及答案(37页珍藏版)》请在人人文库网上搜索。1、第一次课熟悉winTC编译环境、熟悉C语言程序结构1.使用C 语言编译环境&#xff0c;输入下面的源程序。将你…

基于顺序搜索的动态分区分配算法模拟内存动态分配--最佳适应算法(best fit,BF)

BF算法、男朋友算法&#xff0c;哈哈 要实现动态分区分配&#xff0c;需要考虑三个方面的问题。分别是数据结构、分区分配算法、分区的分配与回收操作。 首数据结构 这里我们使用的是空闲分区链&#xff0c;采用双向链表表示空闲分区。 具体实现如下&#xff1a; typedef …

我也要谈谈大型网站架构之系列(4)——分布式中的异步通信

我们知道在面向对象编程中&#xff0c;总会想着各种办法来实现代码的解耦&#xff0c;从而让项目中的各种人员面对自己熟悉的业务进行开发&#xff0c; 做到术业有专攻&#xff0c;比如大家非常熟悉的三层架构&#xff0c;MVC&#xff0c;MVP以及MVVM模式&#xff0c;让前端设计…

node模块函数图解

已截图方式记录模块信息&#xff1a; HTTP模块&#xff1a; 对于网络返回处理状态封装了很多种&#xff0c;我已截图展现 以上状态也是在http协议中包含的状态。 http函数&#xff1a; path模块&#xff1a; 转载于:https://www.cnblogs.com/kuailingmin/p/4547538.html

android 心跳效果动画,Android实现心跳的效果

最近再做一个教育类的项目。在做一些学习工具的时候&#xff0c;美工提出了一些要求&#xff0c;大致如下&#xff1a;其实实现过程也不难&#xff0c;大致就是对一个视图控件添加一个圆形的背景&#xff0c;然后该视图进行动画处理&#xff0c;膨胀的同时&#xff0c;透明度增…

Oracle超出最大连接数问题及解决

用过Oracle的应该都熟悉如何查看和设置Oracle数据库的最大连接数。这里就再啰嗦一遍。 查看当前的连接数&#xff0c;可以用select count(*) from v$process;设置的最大连接数&#xff08;默认值为150&#xff09;select value from v$parameter where name ‘processes’;修改…

操作系统上机作业--使用系统调用实现mycat

mycat.c的功能与系统cat程序相同mycat将指定的文件内容输出到屏幕&#xff0c;例子如下&#xff1a;要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/u…

GCDAynscSocket简单使用-客户端

这是一篇介绍GCDAynscSocket客户端简单使用的文章&#xff08;服务端后续添加&#xff09; 背景&#xff1a;在这篇文章之前我对socket的了解仅限于知道有TCP、UDP两种方式&#xff0c;使用抓包工具时甚至看不懂抓包数据&#xff08;惭愧...&#xff09;&#xff0c;所以本文介…

微信android版字体,微信炫彩字下载-微信七彩字体 安卓版v1.6.2-PC6安卓网

微信七彩字体一款方便的手机字体更换软件&#xff0c;微信炫彩字软件集合了上百款优质中文美化字体&#xff0c;微信七彩发光字里有可爱的喵呜体、卡通体&#xff0c;清秀的静蕾体等多种字体。软件介绍微信、qq上最好用、最个性的聊天字体应用&#xff0c;让你的聊天与众不同&a…

Android SQLite 数据库 增删改查操作

Android SQLite 数据库 增删改查操作 转载▼一、使用嵌入式关系型SQLite数据库存储数据在Android平台上&#xff0c;集成了一个嵌入式关系型数据库——SQLite&#xff0c;SQLite3支持NULL、INTEGER、REAL&#xff08;浮点数字&#xff09;、TEXT(字符串文本)和BLOB(二进制对象…

SIT与UAT的分别

在企业级软件的测试过程中&#xff0c;经常会划分为三个阶段——单元测试&#xff0c;SIT和UAT&#xff0c;如果开发人员足够&#xff0c;通常还会在SIT之前引入代码审查机制&#xff08;Code Review&#xff09;来保证软件符合客户需求且流程正确。下面简单介绍一下SIT和UAT的…

操作系统上机作业--使用系统调用实现mycp

mycp.c的功能与系统cp程序相同将源文件复制到目标文件&#xff0c;例子如下&#xff1a;要求使用系统调用open/read/write/close实现 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nolo…