C语言-关于求余

本文通过C语言代码示例探讨了求余运算的规则,包括正数和负数求余的等价性,求余数和被求余数为负数的情况,以及求余数绝对值大于被求余数绝对值时的结果。同时,文章还展示了求余数大小如何影响结果范围,证明了求余结果始终在0到求余数减1之间变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求余是一种数学计算方法,指一个数除以另一个数,不够除的部分就是余数,就是求余的结果。整除就是一个数除以另一个数,刚刚好的倍数,这里没有四舍五入,不够一倍的都将舍去。

一、求余负数

  • 求余一个负数

验证方法:运算1000次,验证求余正数和求余负数的区别。定义a、b、c三个变量,a从1开始自加2至2000,b从1开始自加1至1000,c从-1开始自减1至-1000,让a在每次循环中分别求余b和c并打印结果。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a, b=1, c=-1;
	for (a = 1; a <= 2000; a+=2)
	{
		printf("a值:%d b值:%d c值:%d	求余b:%d ", a, b, c, a % b);
		printf("求余c:%d\n", a % c);
		b++;
		c--;
	}
	return 0;
}

 运行结果如下:

结论:求余按绝对值计算,求余正负数结果一样 

  • 被求余数为负数

 验证方法:运算1000次,正数和负数求余的区别。定义a、b、c三个变量,a从-1开始自减2至-2000,b从1开始自加1至1000,c从-1开始自减1至-1000,让a在每次循环中分别求余b和c并打印结果。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a, b=1, c=-1;
	for (a = -1; a >= -2000; a-=2)
	{
		printf("a值:%d b值:%d c值:%d	求余b:%d ", a, b, c, a % b);
		printf("求余c:%d\n", a % c);
		b++;
		c--;
	}
	return 0;
}

运行结果如下:

 结论:求余按绝对值计算,求余正负数结果一样,但如果被求余数为负数则求余结果一定为负数

二、求余小数与求余分数

结论:求余本质上是整数间的除法,在整数的除法中,只有能整除与不能整除两种情况,当不能整除时,才产生余数,所以要求被求余数和求余数都必须为整数,即要求“%”两边必须为整数。

a%b                (a必须整数,b必须整数)

三、求余数绝对值大于被求余数绝对值

  1. “%”两边皆为正数
  2. “%”左边为正数,右边为负数
  3. “%”左边为负数,右边为正数
  4. “%”左右皆为负数

 验证方法:运算4000次,求余数绝对值始终大于被求余数绝对值,第一个1000次被求余数与求余数皆为正数,第二个1000次被求余数为负数,求余数为正数,第三个1000次被求余数为负数,求余数为正数,第四个1000次被求余数与求余数皆为负数,通过这四个1000次运算来验证在求余数绝对值大于被求余数绝对值的情况下,被求余数与求余数符号变化下的求余结果。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a1, b1 = 2, a2 = 1, b2 = -2, a3 = -1, b3 = 2, a4 = -1,b4 = -2;
	for (a1 = 1; a1 <= 1000; a1++)
	{
		printf("a值:%d b值:%d	a%%b: % d",a1,b1, a1 % b1);
		b1++;
		printf("	a值:%d b值:%d	a%%b: % d", a2, b2, a2 % b2);
		a2++;
		b2--;
		printf("	a值:%d b值:%d	a%%b: % d", a3, b3, a3 % b3);
		a3--;
		b3++;
		printf("	a值:%d b值:%d	a%%b: % d\n", a4, b4, a4 % b4);
		a4--;
		b4--;
	}
	return 0;
}

运行结果如下:

结论:求余绝对值大于自身绝对值的数结果仍为其自身。 

四、求余数大小与求余结果范围间的关系

验证方法:定义a、b、c三个变量,让a从1开始自加1至100,循环100次,每次循环打印a%b的结果,a每循环100次,b、c值加1,b从1开始,c从0开始,当c=100时结束循环,共循环10000次,验证求余数在1~100范围内求余结果的范围变化。

代码如下:

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a=0, b=1,c=0;
	while(a<=100)
	{
		a++;
		printf("a值:%d	a%%b:%d	",a,a % b);
		if (a == 100)
		{
			printf("\nb值:%d\n", b);
			printf("---------------------------------------------------------------------------------------------------\n");
			a = 0;
			b++;
			c++;
			if (c == 100)
			{
				break;
			}
		}
	}
	return 0;
}

运行结果如下:

观察发现:

b值(求余数)为1时,求余结果始终为0 

b值为2时,求余结果始终在(0~1)间变化

b值为3时,求余结果始终在(0~2)间变化

...

b值为98时,求余结果始终在(0~97)间变化

b值为99时,求余结果始终在(0~98)间变化

b值为100时,求余结果始终在(0~99)间变化

...

b值为n时,求余结果始终在(0~n-1)间变化

结论:求余数为n时,求余结果的范围为0~n-1

<think>嗯,用户想了解C语言中取整和运算符的用法及示例。首先,我需要回忆一下C语言中的相关运算符。取整的话,通常有两种方法:直接强制类型转换,或者使用math.h库里的函数,比如floor和ceil。不过用户可能更关注基本的运算符,所以应该重点讲强制类型转换,也就是(int)这样的方式。不过要注意,强制类型转换是向零取整,而不是四舍五入。例如,对于正数,比如213.04,转换为int就是213;如果是负数,比如-5.9,转换后就是-5。这部分需要例子说明。 然后是运算符,也就是%。这个运算符用于整数,返回除法的数。需要注意的是,%只能用于整数类型,如果操作数是浮点数的话会报错。比如,10 % 3的结果是1,因为10除以3商31。另外,当被除数是负数时,数的符号取决于编译器,不过在C99标准中,数的符号和被除数一致。例如,-10 % 3的结果是-1,而10 % -3的结果是1吗?或者是不是根据标准来确定?这里可能需要查证一下,确保正确性。比如,C99规定数的符号和被除数相同,所以-10 % 3是-1,而10 % -3是1。这部分需要明确说明,避免用户混淆。 接下来,用户需要示例。根据引用中的例子,比如引用4中的(float)转换为int,可以直接用类似的例子。比如float cost = 213.04f;转换为int后是213。而的例子可以用10%3=1,-10%3=-1等等。另外,可能需要提醒用户,%运算符不能用于浮点数,否则会报错,所以如果想对浮点数取,需要使用fmod函数。 另外,用户可能容易犯的错误是混淆取整的方式,比如认为强制转换是四舍五入,但实际上它是截断小数部分。所以需要强调这一点,并建议如果需要四舍五入的话,可以使用round函数或者其他方法。 还要注意运算符的优先级和结合性,比如取和乘除的优先级相同,结合性是从左到右。这部分是否需要提及?可能用户的问题中提到了表达式,所以应该给出一些复合表达式的例子,比如结合赋值运算符的情况。例如,c += a *= 10这样的表达式,不过这可能属于其他运算符的范畴,但用户的问题是关于取整和,所以还是专注于相关部分。 可能还需要讨论负数的情况,比如-5.9转换为int是-5,而使用floor函数的话会得到-6,这之间的区别。不过如果用户的问题不涉及math库的话,可能不需要深入这部分,但可以作为扩展知识提一下。 总结一下,回答的结构应该分为取整和两部分,每部分包括运算符的语法、注意事项、示例代码,并引用已有的例子如引用4中的类型转换。同时,生成相关问题时要围绕这两个运算符的常见问题,比如优先级、负数处理、错误使用的情况等。</think>### C语言中取整与运算符详解 #### 一、取整运算 在C语言中,**取整运算**主要通过**强制类型转换**实现,将浮点数转换为整型时会自动舍弃小数部分(向零取整)。例如: ```c float cost = 213.04f; int a = (int)cost; // 结果为213 ``` 对于负数: ```c float num = -5.9f; int b = (int)num; // 结果为-5(向零取整) ``` 注意: - 强制类型转换不会四舍五入,而是直接截断小数部分[^4]。 - 若需四舍五入,需额外处理,如添加`0.5`后强制转换: ```c float num = 3.6f; int rounded = (int)(num + 0.5); // 结果为4 ``` #### 二、运算符 **运算符** `%` 用于计算两个整数相除的数,语法为 `a % b`。规则如下: ```c int c = 10 % 3; // 结果为1(10 = 3*3 + 1) int d = -10 % 3; // 结果为-1(C99标准规定数符号与被除数一致) int e = 10 % -3; // 结果为1 ``` 注意: - `%` 只能用于整数类型,若操作数为浮点数会编译报错[^4]。 - 若需浮点数,需使用标准库函数 `fmod`: ```c #include <math.h> double result = fmod(10.5, 3.2); // 结果为10.5 - 3*3.2 = 0.9 ``` #### 三、复合表达式示例 结合赋值运算符时,需注意优先级和结合方向: ```c int a = 5, b = 2; a %= b + 1; // 等效于 a = a % (b + 1),结果为0(5 % 3 = 2,但原代码有误,正确结果应为5 % 3 = 2) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值