作业帮 > 综合 > 作业

C语言咋能同时求商和余数

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/15 15:25:38
C语言咋能同时求商和余数
主要是为了减少计算量,比如把数字转成字符,就要先求余(内部应该也是除法,只是和整除取的结果不一样),再整除,如此得除两回,数量量大了这样算冗余计算太多了
或者有其它能提高性能的方法也行
也就是说:计算一次 同时求出余数和商
单纯从纯C语言的角度,不可能.唯一可能的就是除数是2的N次方,直接使用位运算.
C语言中没有这样的计算方式,而且这个冗余计算,对性能的影响太小了,目前的CPU都是每秒百万运算以上级别的,多一次整除运算,消耗的时间即使是百万级别的数据,也不会多出1秒.
如果单纯从优化角度考虑,可以使用内嵌汇编,通过一套整除运算从不同寄存器中取出商和余数,但实际上的消耗,也不是节省了50%,因为多占用了寄存器,并且多了一个传递.这样的方法虽然没有具体试验,但应该节省的非常有限,因为标准整数算法的优化不存在了,可能反而更耗时.
从代码量上看,系统提供函数itoa sprintf format等都可以一个语句完全实现数字转换字符串的功能,但实际上,这些函数的实现,也没有对整除取余进行优化.
再问: 主要是,除整和求余的运算量超级大,就算能提示3成也是相当可观的,也就是计算的不是一两千或一两万位是个超级大的数,比如算 π 值时时
再答: 计算PI值哪里用到整除和取余了?一般按照公式TT/4=1-1/3+1/5-1/7+1/9......1/n,都是浮点数运算吧,没有整数运算。

整数除法和取余是C语言的基本运算,前面说过了,只有通过位运算和内嵌汇编的寄存器方式,能够从理论上提高效率,但实际上,这个理论上的提高没有多大意义,因为编译的合理优化,很可能产生更好的效率。
这个东西是基础运算,C语言层面上,研究基础运算的效率意义真的不大,只有你学习汇编语言的时候,研究寄存器优化,才对整除等运算可能有提高效果。

如果你研究的是大数运算,那么大数用什么存储?即使是64位整数,也不过最大到10进制的20几位数,优化完全没有意义。如果是超过64位,那么根本没法进行整除运算,你只能通过位运算或者更加冗余的字符串数组去实现,这样的方式下,仅仅去优化整除取余,是没有意义的。
再问: 现在用的连续内存空间存的,暂时能计算的最大数的是8的4096次方。
而且,刚才试了,整除和求余取一个性能正好差一半
再答: “整除和求余取一个性能正好差一半”,这个不大认同,实际计算中,很难出现这个情况。

连续空间存储,也要看模式了,如果是纯2进制存储,那么用位运算必然效率最高。用整除运算造成的进位退位非常恐怖。
如果是用的4bit存储一个十进制位(BCD码方式),这种方式提取容易,但本身的计算效率就很低,没什么优化的意义。