以下两个解法感觉都靠谱,并且网上的题解每个人答案都不一样,目前无法判定哪个是正确答案。
方法一:模拟
代码参考博客
- #include <iostream>
- #include <cmath>
- #include <vector>
-
- using namespace std;
-
- int main() {
- const int maxX = 343720;
- const int maxY = 233333;
- const int vx = 15;
- const int vy = 17;
-
- int x = 0, y = 0;
- int time = 0;
- double totalDistance = 0;
- bool xPositive = true, yPositive = true;
-
- while (true) {
- //根据方向判断是+距离还是-距离
- x += xPositive ? vx : -vx;
- y += yPositive ? vy : -vy;
- time++;
- //移动的距离
- double segmentLength = sqrt(vx * vx+ vy * vy);
- // 检查是否碰到边界并反弹
- if (x > maxX || x < 0) {
- xPositive = !xPositive; // 反转X方向
- x = (x > maxX) ? maxX : 0; // 将坐标调整到边界上
- }
- if (y > maxY || y < 0) {
- yPositive = !yPositive; // 反转Y方向
- y = (y > maxY) ? maxY : 0; // 将坐标调整到边界上
- }
-
- // 累加路径长度
- totalDistance += segmentLength;
-
- // 假设当粒子回到原点时停止模拟
- if (x == 0 && y == 0) {
- break;
- }
- }
-
- // 输出总路径长度
- cout << "总路径为:" << totalDistance << endl;
-
- return 0;
- }
复制代码 答案:14261800000
方法二:数学物理题
把速度分解成x方向和y方向,已知x方向来回一趟的时间是2343720/15,y方向来回一趟的时间是2233333/17,已知小球要回到原点,即x和y方向要同时回到原点,时间就是2343720/15和2233333/17的整数倍,即最小公倍数。就能把时间t求出来,然后乘以速度sqrt(15^2+17^2)就是总路程。
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- int a = 2*343720/15;
- int b = 2*233333/17;
- int i = 1;
- while(i*a%b!=0){
- i++;
- }
- double t = i*a;
- double s = t*sqrt(pow(15, 2)+pow(17, 2));
- cout<<fixed<<setprecision(2)<<s<<endl;
- return 0;
- }
复制代码 输出:28520969829.65
复习:最大公因数GCA(Greatest Common Divisor)和最小公倍数LCM(Least Common Multiple)
- int my_gcd(int a,int b){
- if(a%b==0)return b;
- else return my_gcd(b, a%b);
- }
- int my_lcm(int a,int b){
- int i=1;
- while(i*a%b!=0)i++;
- return i*a;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |