鱼C论坛

 找回密码
 立即注册
查看: 1617|回复: 23

求哪位高手解决下,谢谢

[复制链接]
发表于 2022-1-23 16:21:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
正方形ABCD的边长是2 个单位,一只乌龟从A点出发以2个单位每秒的速度顺时针绕正方形运动,另有一个兔子也从A点出发以6个单位每秒的速度逆时针绕正方形动,则它们第2021次相遇在哪个点?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 16:41:36 | 显示全部楼层
本帖最后由 jhq999 于 2022-1-23 16:56 编辑
int s0=0,s1=0,count=0;//s0乌龟爬的距离,s1兔子跑的距离,count相遇次数
while(1)
{
    if((s0%8+s1%8)==8)
    {
         count++;
         if(count==2021)break;
     }
    s0+=2;
    s1+=6;
}
//s0%8 s1%8 结果
当然你也可以在次数上求余,2021%4=1,第一次在1 第二次在2……3……第4次是在原点,所以在第三次遇到的地点

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 16:59:51 | 显示全部楼层
本帖最后由 翼是孤独 于 2022-1-23 17:37 编辑

不好意思读错题了,看成同方向了,看别的代码吧,我这是求同方向的
不过代码下面的分析还是可以用的
----------------------------------------
public class Test {
    public static void main(String[] args) {
        //i、j分别表示记录乌龟和秃子相对A点顺时针距离
        int i  = 0,j = 0;
        //记录乌龟走的距离
        int i_len = 0;
        int count = 2021;
        char[] point = {'A', 'B', 'C', 'D'};
        while(count > 0) {
            i_len += 2;
            i = (i + 2) % 8;
            j = (j + 6)% 8;
            if(i == j) { count--; }
        }
        System.out.println(point[(i_len % 8) / 2] );
    }
}
-------------------------------------------------------------------
上面是通解

实际上乌龟和秃子只会在A C 两点相遇。
第一次在C,第二次在A,第三次在C ...
你可以发现第三次和第一次其实是等价的情况,相遇在A点也就相当于重新出发

所以简化一下,直接2021%2 = 1 所以是在C点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:01:46 | 显示全部楼层
jhq999 发表于 2022-1-23 16:41
当然你也可以在次数上求余,2021%4=1,第一次在1 第二次在2……3……第4次是在原点,所以在第三次遇到的 ...

(s0 % 8 + s1 % 8) == 8 并不是相遇点吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:05:45 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-23 17:07 编辑

#include <stdio.h>

int main()
{
    char points[4] = {'A', 'B', 'C', 'D'};
    int t, r, p;
    t = r = 0; // t 为乌龟当前点,r 为兔子当前点,n 为相遇次数
    for(int n = 0; n < 2021; t = (t+1)%4, r = (r+3)%4){
        if(t == r && t){
            p = t; // 将最新相遇点存入 p
            n++;
        }
    }
    printf("它们第 2021 次相遇的点:%c 点", points[p]); // 最终相遇点
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:08:57 | 显示全部楼层
本帖最后由 jhq999 于 2022-1-23 17:13 编辑
翼是孤独 发表于 2022-1-23 17:01
(s0 % 8 + s1 % 8) == 8 并不是相遇点吧

我认为开始时不能称作相遇
第一次在b,乌龟爬了2,兔子跑了6
第二次在c ,4,12
3次            d    6  18
4次            a    8  24
然后重复重复再重复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:14:23 | 显示全部楼层
jhq999 发表于 2022-1-23 17:08
我认为开始时不能称作相遇
第一次在b,乌龟爬了2,兔子跑了6
第二次在c ,4,12

哦哦,你是直接计算出来和是8再写的代码
我还以为你的意思是加起来是一圈就相遇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:26:23 | 显示全部楼层
#include "stdio.h"
void main()
{
        int s0=0,s1=0,count=0,time=0;//s0乌龟爬的距离,s1兔子跑的距离,count相遇次数
        while(count<2021)
        {
                if((s0%8+s1%8)==8)
                {
                        count++;
                        if(count==2021)
                        {
                                printf("第2021次相遇在%d秒后。\n",time);
                                switch(s0%8)
                                {
                                case 0:printf("相遇在点“A”。\n");break;
                                case 2:printf("相遇在点“B”。\n");break;
                                case 4:printf("相遇在点“C”。\n");break;
                                case 6:printf("相遇在点“D”。\n");break;
                                }
                        }
                }
                s0+=2;
                s1+=6;
                time++;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-23 17:30:00 | 显示全部楼层
jhq999 发表于 2022-1-23 16:41
当然你也可以在次数上求余,2021%4=1,第一次在1 第二次在2……3……第4次是在原点,所以在第三次遇到的 ...

如果顺时针为ADCB,求余为1,应该在D点,为什么是第三次遇到的呢?谢谢,请指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-23 17:30:50 | 显示全部楼层
翼是孤独 发表于 2022-1-23 16:59
上面是通解

实际上乌龟和秃子只会在A C 两点相遇。

这个是求同方向,相遇的点位吧,谢谢,又多学了一招
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:34:27 | 显示全部楼层
bz00 发表于 2022-1-23 17:30
这个是求同方向,相遇的点位吧,谢谢,又多学了一招

哈哈哈,原来是我读错题了,我还以为两个都是同方向
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 17:47:13 | 显示全部楼层

请问if(t == r&&t)是什么意思啊?为什么不是直接t=r?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 18:09:05 | 显示全部楼层
本帖最后由 jhq999 于 2022-1-23 18:15 编辑
bz00 发表于 2022-1-23 17:30
如果顺时针为ADCB,求余为1,应该在D点,为什么是第三次遇到的呢?谢谢,请指教


领会精神,1应该是B点我搞错了,2是c, 3是d, 0是A
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 18:10:28 | 显示全部楼层
翼是孤独 发表于 2022-1-23 17:14
哦哦,你是直接计算出来和是8再写的代码
我还以为你的意思是加起来是一圈就相遇

相反方向当然是加起来一圈相遇
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 18:15:09 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-1-23 18:45 编辑
青枫, 发表于 2022-1-23 17:47
请问if(t == r&&t)是什么意思啊?为什么不是直接t=r?


因为题目要求相遇,第一次(t = 0)不算,所以从 t = 1 开始,但是我的代码也是错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 18:36:45 | 显示全部楼层
bz00 发表于 2022-1-23 17:30
如果顺时针为ADCB,求余为1,应该在D点,为什么是第三次遇到的呢?谢谢,请指教

抱歉了,读错题目,原来乌龟和兔子是反方向移动,我的代码也不正确,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 18:48:39 | 显示全部楼层
/*

 A ------ B
 |        |
 |        |
 |        |
 D ------ C
 
*/
#include <stdio.h>

int main()
{
    char turtle[4] = {'A', 'B', 'C', 'D'}; // 乌龟路线(顺时针)
    char rabbit[4] = {'A', 'D', 'C', 'B'}; // 兔子路线(逆时针)
    int t, r, p;
    t = r = 0; // t 为乌龟当前点,r 为兔子当前点,n 为相遇次数
    for(int n = 0; n <= 2021; t = (t+1)%4, r = (r+3)%4)
    {
        if(turtle[t] == rabbit[r]){
            p = t; // 将最新相遇点存入 p
            n++;
        }
    }
    printf("它们第 2021 次相遇的点:%c 点", turtle[p]); // 最终相遇点
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 20:15:12 | 显示全部楼层
各位都看错题了吧
$ cat main.c
#include <stdio.h>

size_t tortoise_next(size_t index) {
    return (index + 2) % 8;
}

size_t rabbit_next(size_t index) {
    return 7 - (7 - index + 6) % 8;
}

int main(void) {
    // A B C
    // H   D
    // G F E
    //char point[8] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
    size_t tortoise = 0;
    size_t rabbit = 0;
    size_t count = 0;
    while(count != 2021) {
    //while(count != 1) {
    //while(count != 2) {
    //while(count != 3) {
        tortoise = tortoise_next(tortoise);
        rabbit = rabbit_next(rabbit);
        if(tortoise == rabbit) ++count;
    }
    printf("%c\n", (char)(tortoise + 'A'));
    return 0;
}
$ gcc-debug -o main main.c
$ ./main
C
$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 21:46:34 | 显示全部楼层
#include <iostream>
using namespace std;

int main()
{
        int a,b;
        int x = 2;//乌龟速度
        int y = 6;//兔子速度
        float t;
        int z = 2012 * 6;//2012次相遇走的总路程
        t = z/(x+y);//2012次相遇所需时间
        a = t*6;//兔子所走路程
        b = a%6;//算出结果
        cout << b << endl;


        system("pause");

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-23 22:24:49 | 显示全部楼层
张大帅 发表于 2022-1-23 21:46
#include
using namespace std;

可以解释一下最终结果的含义吗?
最后的 b 表示什么?
题目最后是问它们第2021次相遇在哪个点?
a%6的值是 [0, 5]
如果最终得到的值是3,那就是在3点相遇?
3点是哪个点?正方形的右下角?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表