| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2308 人关注过本帖
标题:对负数取模
只看楼主 加入收藏
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
结帖率:93.75%
收藏
已结贴  问题点数:20 回复次数:7 
对负数取模

比如 -1%7   我希望他能返回6   应该用什么函数?
   1%7    希望还是返回1      
2016-08-05 11:28
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
你的意思是如果是负数,就用除数+余数。
如果是正数就不作处理。
2016-08-05 11:39
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:10 
对于整型数a,b来说,取模运算方法:
1.求 整数商: c = a/b;
2.计算模: r = a - c*b.
求模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
例如:
1、计算-1 Mod 7
那么:a = -1;b = 7;
第一步:求整数商c,如进行求模运算c = -1/7约为-0.142857(向负无穷方向舍入),所以求模时C=-1;
第二步:计算模r = -1-(-1)*7=6。
2、同理啊 1 mod 7
第一步计算c=1/7约为0.142857(向负无穷方向舍入),所以求模时C=0;
第二步:计算模r=1-0*7=1

你正常计算模就可以了啊,用什么函数是指计算方法吗?那你把我上面说的计算方法写成一个函数就可以计算了,是不是考虑向负无穷方向舍入,应该用什么函数?那你试试floor();

[此贴子已经被作者于2016-8-5 13:20编辑过]

2016-08-05 13:16
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
同类的几个数学取值函数:如:pi=3.1415
1:fix(n)的意义是取小于n的整数(是向零点舍入的意思是往零的方向上靠);例:fix(pi)=3;fix(3.5)=3;fix(-3.5)=-3;
2:round(n)的意思是纯粹的四舍五入,意思与我们以前数学中的四舍五入是一样的;例round(pi)=3;round(3.5)=4;round(-3.5)=-4;round(-3.1)=-3
3:ceil(n)的意思是向正方向舍入;例ceil(pi)=4; ceil(3.5)=4;  ceil(-3.2)=-3;向正方向舍入
4:floor(n)向负方向舍入;例floor(pi)=3;floor(3.5)=3;floor(-3.2)=-4;向负方向舍入
我想你需要的应该是floor()
2016-08-05 13:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
(n%7+7)%7

程序代码:
#include <stdio.h>

#define MOD7(n) (((n)%7+7)%7)

int main( void )
{
    printf( "-1%%7 == %d\n", MOD7(-1) );
    printf( "+1%%7 == %d\n", MOD7(+1) );
}
输出
-1%7 == 6
+1%7 == 1
2016-08-05 14:03
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
risp版主的方法很妙誒。。。
我本来是打算找一下看有没有现成能用的库函数。-1%7返回的是-1,而mod函数我又找不到,只找到一个fmod然而是用于浮点数的求模,也不恰当。
后来赶时间就简单加了一个   if(..<0)..+=7   


。。。谢诸位。。。这两天初涉Linux虚拟机,很头疼,所以就没上来。

φ(゜▽゜*)♪
2016-08-07 21:05
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 6楼 书生牛犊
在过去,除 或 模除 的两个操作数中,只要有一个是负数,那么结果就是“实现定义的”。(只在 趋零 和 趋负无穷 之间选择)
自从C99开始,则规定 除 的结果向零趋近,模除 的结果和第一操作数同符号。(这两个规定是一回事,定义了一个就必然能推导出另一个。)
在过去,因为结果是实现定义的,所以C标准定义了两个宏---DIV和MOD,它们的行为和现在C99的/和%行为一致,也就是说现在不需要使用这两个宏了。

就是简单解释一下你为什么找不到mod函数,因为它是MOD宏 ^_^
2016-08-07 21:24
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 7楼 rjsp
谢谢

φ(゜▽゜*)♪
2016-08-08 09:03
快速回复:对负数取模
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024981 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved