【问题标题】:C: Calculating the distance between 2 floats modulo 12C:计算 2 个浮点数模 12 之间的距离
【发布时间】:2011-09-05 18:36:55
【问题描述】:

我需要一个函数 dist( a, b ) // 0 ≤ a,b

例如,

dist( 1, 2 )
 = dist( 2, 1 )
 = dist( 11, 0 )
 = dist( 0, 11 )
 = dist( 0.5, 11.5 )
 = 1

编辑:虽然这可以通过一些黑客攻击轻松完成,但我觉得必须有一些直观的解决方案,可能是使用 fmod 和模 6

【问题讨论】:

  • 为什么投反对票?你们是不是只看第一个答案,并认为这是微不足道的,因为 ChrisLegend 如此声明?
  • @Ohmu 是因为没有问题,也没有明显的尝试。
  • @pickypg 你可能是对的。尽管如此,我认为任何反对投票的人都应该考虑......这个问题是隐含的;任何有智慧的人都不会错过它。此外,我认为用半生不熟的实施来混淆水域是不好的做法。它不适用于制作干净的问答资源。对于几周后浏览问题的人来说,这个提法将准确地表达主题,没有任何毫无价值的跳跃,以避免冒犯人们无意识的文化敏感性。
  • 从某种角度来看,请考虑工具提示中关于向下投票箭头的内容:This question does not show any research effort;...。你的问题是什么? I require a function... [and some various examples] 您是否已经尝试过为自己寻找解决方案?好吧,你还没有展示出来。您实际上所做的是plzsendtehcodez 问题。这可能不是你的本意,但你没有把你的情况说得很清楚。
  • 嗯,我认为这个网站是一个教学环境,教学/辅导的一个重要规则是永远不要马上给出完整的答案(也就是给密码),因为学生必须努力找到答案,因为如果他们不这样做,他们就不会学到任何东西。

标签: c distance modulo


【解决方案1】:

类似

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 );

}

使用数学库。

【讨论】:

  • 感谢发布代码,直觉上我觉得一定有一些更优雅的解决方案(这就是我首先发布的原因)。但是如果有的话我就看不到了,看不清楚,这是最整洁的解决方案。
  • 你总是需要比较两个距离(顺时针和逆时针)
【解决方案2】:

首先,最优解是不平凡的,需要一点思考。

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 已经 >=0 和
  • @trutheality,我在问题中指定了该标准。
  • 24 用 PHP 实现:function distMod24($a,$b){ $diff = abs($b-$a);返回 ($diff
【解决方案3】:

如果我没看错的话,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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多