C语言取模运算(取余运算)

C语言取模运算(取余运算)

取模算法:

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

取余(取模)的奥义

“/”在我们这些程序中代表整除,它符合除法法则,异号抵消。
再看看我们余数的定义:
整除“余”下的“数”。
则有:余数=被除数-商除数
商就是我们整除的结果。
看例子:
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

综上所述可以得出结论:被除数如果是负数,那么无论除数正负,结果都是负数。

C语言运用

除了上边的运算模式外取余还有其他的运用,由于能力有限在这只总结了其中一部分

1、任何数%2都可以检测是否为偶数,如果结果等于1则表示为奇数
示例:
100 % 2 = 0;101 % 2 = 1;
2、如果想要限制一个数的大小,除了用位与运算除外还可以用取余运算
示例:
100 % 5 = 0; 101 % 5 = 1;102 % 5 = 2; 103 % 5 = 3; 104 % 5 = 4; 105 % 5 = 0; …
示例代码:
int main()
{
int i = 100, j = 5, k = 0;
for (i; i<110; i++)
{
k = i % j;
printf("%d\t", k);
}
return 0;

}
运行结果:
0 1 2 3 4 0 1 2 3 4
3、如果 smallnum % bignum;结果将会是smallnum 本身的值
示例:
10 % 88= 10; 11 % 88 = 11; 11 % 89 = 11;

本文参考:https://blog.csdn.net/yingbinchina/article/details/2715549

### 使用C语言进行运算处理硬币问题 在解决硬币问题时,通常需要计算给定金额能够由不同面额的硬币组合而成的方式数量。下面展示了一个简单的例子,该程序接收一个总金额作为输入,并输出组成这个金额所需的最少硬币数目。 ```c #include <stdio.h> int minCoins(int coins[], int m, int V) { // 表格 dp[i] 将保存价值 i 的最小硬币数 int table[V + 1], i, j; // 如果V是0,则不需要任何硬币来构成价值 table[0] = 0; // 初始化所有表格值为无穷大 for (i = 1; i <= V; i++) table[i] = INT_MAX; for (i = 1; i <= V; i++) { // 遍历每种类型的硬币 for (j = 0; j < m; j++) if (coins[j] <= i) { int sub_res = table[i - coins[j]]; if (sub_res != INT_MAX && sub_res + 1 < table[i]) table[i] = sub_res + 1; } } if(table[V]==INT_MAX) return -1; return table[V]; } // 辅助函数用于测试上述功能 void testMinCoins() { int coins[] = {1, 2, 5}; int m = sizeof(coins)/sizeof(coins[0]); int V = 11; printf("Minimum coins required is %d\n", minCoins(coins, m, V)); } ``` 此代码片段定义了`minCoins()` 函数,其接受三个参数:硬币数组 `coins[]`, 数组大小 `m` 和目标金额 `V`. 此外还有一个辅助函数 `testMinCoins()` 来验证实现的效果[^1]. 在这个解决方案中,动态规划被用来有效地找到最优解法。对于每一个可能的价值 v (从 1 到 V),都会尝试使用不同的硬币去构建它,并记录下所需要的最少硬币数量。如果无法恰好凑成指定数额,则返回 `-1`.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值