鱼C论坛

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

求哪位高手解决下,谢谢

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

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

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

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

使用道具 举报

发表于 2022-1-23 16:41:36 | 显示全部楼层
本帖最后由 jhq999 于 2022-1-23 16:56 编辑

  1. int s0=0,s1=0,count=0;//s0乌龟爬的距离,s1兔子跑的距离,count相遇次数
  2. while(1)
  3. {
  4.     if((s0%8+s1%8)==8)
  5.     {
  6.          count++;
  7.          if(count==2021)break;
  8.      }
  9.     s0+=2;
  10.     s1+=6;
  11. }
  12. //s0%8 s1%8 结果
复制代码

当然你也可以在次数上求余,2021%4=1,第一次在1 第二次在2……3……第4次是在原点,所以在第三次遇到的地点

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

-------------------------------------------------------------------
上面是通解

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

所以简化一下,直接2021%2 = 1 所以是在C点
小甲鱼最新课程 -> https://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 并不是相遇点吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char points[4] = {'A', 'B', 'C', 'D'};
  5.     int t, r, p;
  6.     t = r = 0; // t 为乌龟当前点,r 为兔子当前点,n 为相遇次数
  7.     for(int n = 0; n < 2021; t = (t+1)%4, r = (r+3)%4){
  8.         if(t == r && t){
  9.             p = t; // 将最新相遇点存入 p
  10.             n++;
  11.         }
  12.     }
  13.     printf("它们第 2021 次相遇的点:%c 点", points[p]); // 最终相遇点
  14.     return 0;
  15. }
复制代码
小甲鱼最新课程 -> https://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
然后重复重复再重复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哦哦,你是直接计算出来和是8再写的代码
我还以为你的意思是加起来是一圈就相遇
小甲鱼最新课程 -> https://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++;
        }
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果顺时针为ADCB,求余为1,应该在D点,为什么是第三次遇到的呢?谢谢,请指教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这个是求同方向,相遇的点位吧,谢谢,又多学了一招
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈哈,原来是我读错题了,我还以为两个都是同方向
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问if(t == r&&t)是什么意思啊?为什么不是直接t=r?
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

相反方向当然是加起来一圈相遇
小甲鱼最新课程 -> https://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 开始,但是我的代码也是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

抱歉了,读错题目,原来乌龟和兔子是反方向移动,我的代码也不正确,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. A ------ B
  3. |        |
  4. |        |
  5. |        |
  6. D ------ C

  7. */
  8. #include <stdio.h>

  9. int main()
  10. {
  11.     char turtle[4] = {'A', 'B', 'C', 'D'}; // 乌龟路线(顺时针)
  12.     char rabbit[4] = {'A', 'D', 'C', 'B'}; // 兔子路线(逆时针)
  13.     int t, r, p;
  14.     t = r = 0; // t 为乌龟当前点,r 为兔子当前点,n 为相遇次数
  15.     for(int n = 0; n <= 2021; t = (t+1)%4, r = (r+3)%4)
  16.     {
  17.         if(turtle[t] == rabbit[r]){
  18.             p = t; // 将最新相遇点存入 p
  19.             n++;
  20.         }
  21.     }
  22.     printf("它们第 2021 次相遇的点:%c 点", turtle[p]); // 最终相遇点
  23.     return 0;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. size_t tortoise_next(size_t index) {
  4.     return (index + 2) % 8;
  5. }

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

  9. int main(void) {
  10.     // A B C
  11.     // H   D
  12.     // G F E
  13.     //char point[8] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
  14.     size_t tortoise = 0;
  15.     size_t rabbit = 0;
  16.     size_t count = 0;
  17.     while(count != 2021) {
  18.     //while(count != 1) {
  19.     //while(count != 2) {
  20.     //while(count != 3) {
  21.         tortoise = tortoise_next(tortoise);
  22.         rabbit = rabbit_next(rabbit);
  23.         if(tortoise == rabbit) ++count;
  24.     }
  25.     printf("%c\n", (char)(tortoise + 'A'));
  26.     return 0;
  27. }
  28. $ gcc-debug -o main main.c
  29. $ ./main
  30. C
  31. $
复制代码
小甲鱼最新课程 -> https://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;
}
小甲鱼最新课程 -> https://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点是哪个点?正方形的右下角?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 01:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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