递归火山软件开发平台

标题: 寻找一个算法 [打印本页]

作者: urenai    时间: 2024-2-17 18:08
标题: 寻找一个算法
算    圆周 的 一个 点,距离 下一个点  应该是  正向近 还是 逆向 近?
例如:
时钟表盘,当前时针指向  6时,
如果目标 是 3时,那就必须  逆行  6 -1 -1 -1 =3,即3个步骤。
如果目标 是 9时,那就必须  正行  6 +1 +1 +1 =9 ,即 3个步骤。

如果错误算法,将导致步骤增加。例如6时正向到3时,将需要9个步骤。

有什么好的思路吗?
请指教。

作者: CPUCN    时间: 2024-2-17 20:04
顺时针计算一下长度
逆时针在计算一下长度
两个比较一下,哪个短就用哪个

作者: b0y    时间: 2024-2-17 20:06
可以根据2个点和圆心的夹角是否小于180
作者: 山梦    时间: 2024-2-17 20:09
本帖最后由 山梦 于 2024-2-17 20:10 编辑

哈哈,学习
作者: hs999xl    时间: 2024-2-17 21:18
学习,哈哈
作者: 易入门    时间: 2024-2-17 21:44
CPUCN 发表于 2024-2-17 20:04
顺时针计算一下长度
逆时针在计算一下长度
两个比较一下,哪个短就用哪个

这种好像是最原始的办法!
作者: CPUCN    时间: 2024-2-17 21:52
易入门 发表于 2024-2-17 21:44
这种好像是最原始的办法!

这根本不需要什么算法
就是一个简单的判断就搞定了
千万别把简单的问题复杂化。
作者: uuyyhhjj    时间: 2024-2-18 00:45
只会初中三角函数判断角度,一开始感觉很简单,想了下好像又没那么简单,干脆写了一下
(, 下载次数: 3)
作者: urenai    时间: 2024-2-18 01:40

我滴个天,我捣鼓出来了才发现有兄弟给弄了。

  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 _取差值 <公开 静态 类型 = 整数 @禁止流程检查 = 真>
  3. 参数 v1 <类型 = 整数>
  4. 参数 v2 <类型 = 整数>
  5. {
  6.     @ while (@<v1> < 0) {@<v1> += 12;}
  7.     @ while (@<v1> > 11){@<v1> -= 12;}
  8.     @ while (@<v2> < 0) {@<v2> += 12;}
  9.     @ while (@<v2> > 11){@<v2> -= 12;}
  10.     @ int v3 = min(abs(@<v1> - @<v2>), 12 - abs(@<v1> - @<v2>));
  11.     @ return @<v1> <= @<v2> ? v3 : -v3;

  12. }
复制代码

作者: 山梦    时间: 2024-2-18 08:59
<火山程序 类型 = "通常" 版本 = 1 />

方法 _取差值 <公开 静态 类型 = 整数 "">
参数 v1 <类型 = 整数>
参数 v2 <类型 = 整数>
{
    变量 v3 <类型 = 整数>
    如果 (取整数绝对值 (v1 - v2) > 6)
    {
        v3 = 12 - 取整数绝对值 (v1 - v2)
    }
    否则
    {
        v3 = 取整数绝对值 (v1 - v2)
    }
    返回 (v3)




}

作者: weilai    时间: 2024-2-18 09:16

<火山程序 类型 = "通常" 版本 = 1 />

方法 取差值 <公开>
参数 v1 <类型 = 整数>
参数 v2 <类型 = 整数>
{
    返回 (取较小值 (取整数绝对值 (v1 - v2), 12 - 取整数绝对值 (v1 - v2)))

}

作者: 一帆风    时间: 2024-2-18 10:29
b0y 发表于 2024-2-17 20:06
可以根据2个点和圆心的夹角是否小于180

这个方法是正确的
作者: alexqj    时间: 2024-2-18 11:29
感觉想复杂了啊
不需要算法,直接用目标减当前点
结果为正,就正行,为负,就逆行

作者: urenai    时间: 2024-2-18 12:51
urenai 发表于 2024-2-18 01:40
我滴个天,我捣鼓出来了才发现有兄弟给弄了。

    @ while (@<v1> < 0) {@<v1> += 12;}
    @ while (@<v1> > 11){@<v1> -= 12;}
    @ while (@<v2> < 0) {@<v2> += 12;}
    @ while (@<v2> > 11){@<v2> -= 12;}
    @ int v3 = min(abs(@<v1> - @<v2>), 12 - abs(@<v1> - @<v2>));
    @ return @<v1> <= @<v2> ? v3 : -v3;
前面4行意思是,你输入大于或小于区间值,更正一次。
例如你输入的值是 v1=13  ,实际输出 v1=1,这样保证结果绝对正确。
第5句就是取出最小值,但是这个最小值是  正数   肯定不为负。
依赖第6句,是否返回负
作者: weilai    时间: 2024-2-18 14:03
urenai 发表于 2024-2-18 12:51
@ while (@ < 0) {@ += 12;}
    @ while (@ > 11){@ -= 12;}
    @ while (@ < 0) {@ += 12;}

(, 下载次数: 49)
用火山直接写比较简单
作者: blackangeldsf    时间: 2024-2-19 16:38
你们都是玩C++的吗,咋都那么牛。




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4