问题描述
||
我需要一个函数dist(a,b)// 0≤a,b <12,该函数使用模12返回最短(绝对值+ ve)距离ala时钟算术。
例如
dist( 1,2 )
= dist( 2,1 )
= dist( 11,0 )
= dist( 0,11 )
= dist( 0.5,11.5 )
= 1
编辑:虽然可以轻松地通过一些黑客手段来做到这一点,但我觉得必须有一些直观的解决方案,可能是使用fmod和modulo 6
解决方法
首先,最优解决方案是不平凡的,这需要一些思考。
float distMod12(float a,float b)
{
float diff = fabs( b - a );
return ( diff < 6 ) ? diff : 12 - diff;
}
编辑:或者,
return MIN( diff,12 - diff ); // needs a MIN function
完整的代码在这里列出:http://ideone.com/XxRIw
, 如果我没看错的话,a和b不是负数,并且小于12。
#include <math.h>
#include <stdio.h>
double min( double a,double b ) {
return a < b ? a : b;
}
double dist( double a,double b ) {
return min(
fmod( 12+b-a,12 ),fmod( 12+a-b,12 )
);
}
int main() {
printf(\"%f\\n\",dist(1,2));
printf(\"%f\\n\",dist(2,1));
printf(\"%f\\n\",dist(11,0));
printf(\"%f\\n\",dist(0,11));
printf(\"%f\\n\",dist(0.5,11.5));
return 0;
}
简化为
double dist( double a,double b ) {
double diff = fmod( 12+a-b,12 );
return diff <= 6 ? diff : 12-diff;
}
, 就像是
float dist( float a,float b ){
float amod,bmod;
amod = fmod( a,12 );
bmod = fmod( b,12 );
if( amod < bmod ) return dist( bmod,amod );
return min( amod-bmod,bmod-amod+12 );
}
使用数学库。