服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

香港云服务器
服务器之家 - 编程语言 - C/C++ - C语言编程深入理解取整取余取模问题示例分析

C语言编程深入理解取整取余取模问题示例分析

2022-03-02 14:59鹿九丸 C/C++

这篇文章主要为大家介绍了C语言编程深入理解取整取余取模问题的示例分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

1. 取整问题

1.0向取整(C语言默认的取整方案)

#include<stdio.h>
#include<windows.h>
int main()
{
	//本质是向0取整
 //trunc()函数也有这种作用,不过返回值是浮点数,而且必须引用math.h头文件
	int i = -2.9;
	int j = 2.9;
	printf("%d\n", i); //结果是:-2
	printf("%d\n", j); //结果是:2
	system("pause");
	return 0;
}

C语言编程深入理解取整取余取模问题示例分析

2.地板取整(向负无穷的方向取整)

#include <stdio.h>
#include <math.h> //因为使用了floor函数,需要添加该头文件
#include <windows.h>
int main()
{
	//本质是向-∞取整,注意输出格式要不然看不到结果
	printf("%.1f\n", floor(-2.9)); //-3
	printf("%.1f\n", floor(-2.1)); //-3
	printf("%.1f\n", floor(2.9)); //2
	printf("%.1f\n", floor(2.1)); //2
	system("pause");
	return 0;
}

 注意:

使用floor()函数需要引头文件,参数为double 类型。返回值也同样为double类型。

同时不要忘了引math.h头文件。

C语言编程深入理解取整取余取模问题示例分析

C语言编程深入理解取整取余取模问题示例分析

 注意:python默认的取整方案就是地板取整,后面也正是因为这个原因,才出现了取模的不同!

3.天花板取整(向+无穷的方向取整)

#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
	//本质是向+∞取整,注意输出格式要不然看不到结果
	printf("%.1f\n", ceil(-2.9)); //-2
	printf("%.1f\n", ceil(-2.1)); //-2
	printf("%.1f\n", ceil(2.9)); //3
	printf("%.1f\n", ceil(2.1)); //3
	system("pause");
	return 0;
}

注意:

使用ceil()函数需要引头文件,参数为double 类型。

返回值也同样为double类型。同时不要忘了引math.h头文件。

C语言编程深入理解取整取余取模问题示例分析

C语言编程深入理解取整取余取模问题示例分析

4.四舍五入取整

#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
//本质是四舍五入
printf("%.1f\n", round(2.1));
printf("%.1f\n", round(2.9));
printf("%.1f\n", round(-2.1));
printf("%.1f\n", round(-2.9));
system("pause");
return 0;
}

注意:使用round()函数需要引头文件,参数为double 类型。返回值也同样为double类型。同时不要忘了引math.h头文件。

汇总例子

#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
	const char* format = "%.1f \t%.1f \t%.1f \t%.1f \t%.1f\n";
	printf("value\tround\tfloor\tceil\ttrunc\n");
	printf("-----\t-----\t-----\t----\t-----\n");
	printf(format, 2.3, round(2.3), floor(2.3), ceil(2.3), trunc(2.3));
	printf(format, 3.8, round(3.8), floor(3.8), ceil(3.8), trunc(3.8));
	printf(format, 5.5, round(5.5), floor(5.5), ceil(5.5), trunc(5.5));
	printf(format, -2.3, round(-2.3), floor(-2.3), ceil(-2.3), trunc(-2.3));
	printf(format, -3.8, round(-3.8), floor(-3.8), ceil(-3.8), trunc(-3.8));
	printf(format, -5.5, round(-5.5), floor(-5.5), ceil(-5.5), trunc(-5.5));
	system("pause");
	return 0;
}

C语言编程深入理解取整取余取模问题示例分析

 

2.取模问题 

1.余数的定义

余数的定义:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = q*d + r , q 为整数,且0 ≤ |r|< |d|。其中,q 被称为商,r 被称为余数。

注意:余数并不一定都是正数,大家一定要牢记这个概念!

2.两种余数

由定义可知:

-10%3=-1------>-10/3=-3------->3*(-3)+(-1)=(-10)(C语言中是这样的)

-10%3=2------->-10/3=-4------->4*(-3)+ 2=(-10)(python环境中是这样的)

解释C: -10 = (-3) * 3 + (-1)(负余数)

解释Python:-10 = (?)* 3 + 2,其中,可以推到出来,'?'必须是-4

即-10 = (-4)* 3 + 2,才能满足定义。(正余数)

所以,在不同语言,同一个计算表达式,负数“取模”结果是不同的。我们可以称之为分别叫做正余数和负余数。

3.为什么会有这种现象?

由上面的例子可以看出,具体余数r的大小,本质是取决于商q的。

而商,又取决谁呢?取决于除法计算的时候,取整规则。

C语言中默认是0向取整,python中默认是-无穷的方向取整。

 

3.区分取余与取模

1.取余与与取模的本质区别

取余:尽可能让商,进行向0取整。

取模:尽可能让商,向负无穷方向取整。

所以:

C中%,本质其实是取余。

Python中%,本质其实是取模。

2.理解链

对任何一个大于0的数,对其进行0向取整和负无穷取整,取整方向是一致的。故取模等价于取余。其实这也是为什么我们常常会认为取模以取余是一码事的原因所在。

对任何一个小于0的数,对其进行0向取整和负无穷取整,取整方向是相反的。故取模不等价于取余。

3.同符号与不同符号

1.同符号:

同符号数据相除,得到的商,一定是正数,即大于0! 故,在对其商进行取整的时候,取模等价于取余。(倘若从数学上理解,就是简单的在负数的前面加一个绝对值即可)

C语言编程深入理解取整取余取模问题示例分析

2.不同符号

#include<stdio.h>
#include <windows.h>
int main()
{
	printf("%d\n", -10 / 3); //结果:-3
	printf("%d\n\n", -10 % 3); //结果:-1 为什么? -10=(-3)*3+(-1)
	printf("%d\n", 10 / -3); //结果:-3
	printf("%d\n\n", 10 % -3); //结果:1 为什么?10=(-3)*(-3)+1
	system("pause");
	return 0;
}

从上面可以看出:

被除数为负数时,取余后为负号。

除数为负数时,取余后为正数。

不同符号在C语言中虽然也有一定的规律,但我并不希望大家利用这个规律,而是利用定义老老实实的计算,毕竟这这是针对C语言的结论,在python中就不适用了,因为二者的取整方式是不同的。

以上就是C语言编程深入理解取整取余取模问题示例分析的详细内容,更多关于C语言取整取余取模问题的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_57304511/article/details/121345271

延伸 · 阅读

精彩推荐
  • C/C++详解c语言中的 strcpy和strncpy字符串函数使用

    详解c语言中的 strcpy和strncpy字符串函数使用

    strcpy 和strcnpy函数是字符串复制函数。接下来通过本文给大家介绍c语言中的strcpy和strncpy字符串函数使用,感兴趣的朋友跟随小编要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重载 重定义与重写用法详解

    C++之重载 重定义与重写用法详解

    这篇文章主要介绍了C++之重载 重定义与重写用法详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    青山的青6062022-01-04
  • C/C++深入理解goto语句的替代实现方式分析

    深入理解goto语句的替代实现方式分析

    本篇文章是对goto语句的替代实现方式进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网7342020-12-03
  • C/C++C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件...

    针眼_6702022-01-24
  • C/C++C/C++经典实例之模拟计算器示例代码

    C/C++经典实例之模拟计算器示例代码

    最近在看到的一个需求,本以为比较简单,但花了不少时间,所以下面这篇文章主要给大家介绍了关于C/C++经典实例之模拟计算器的相关资料,文中通过示...

    jia150610152021-06-07
  • C/C++C语言实现电脑关机程序

    C语言实现电脑关机程序

    这篇文章主要为大家详细介绍了C语言实现电脑关机程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    xiaocaidayong8482021-08-20
  • C/C++学习C++编程的必备软件

    学习C++编程的必备软件

    本文给大家分享的是作者在学习使用C++进行编程的时候所用到的一些常用的软件,这里推荐给大家...

    谢恩铭10102021-05-08
  • C/C++c++ 单线程实现同时监听多个端口

    c++ 单线程实现同时监听多个端口

    这篇文章主要介绍了c++ 单线程实现同时监听多个端口的方法,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下...

    源之缘11542021-10-27
634