繁体   English   中英

我在确定是否存在一个整数N从而使x1 + v1 * N = x2 + v2 * N时存在缺陷的地方在哪里?

[英]Where is my flaw in determining whether there exists an int N such that x1 + v1 * N = x2 + v2 * N

因此,我试图解决一个问题,在这种情况下,您要确定两个袋鼠是否最终会同时降落在同一点上,因为一个袋鼠开始于位置x1且每跳的行进距离为v1 ,而另一个袋鼠x2v2进行了测量。

例:

输入0 3 4 2表示x1=0v1=3x2=4v2=2 它们最终将落在同一点上,因为它们从起点到起点的距离以及每一跳之后

0 -> 3 -> 6 -> 9  -> 12
4 -> 6 -> 8 -> 10 -> 12

我的解决方案无法通过一些测试用例,我想知道我的O(1)解决方案的逻辑缺陷在哪里:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution
{
    static void Main(String[] args) {
        string[] tokens_x1 = Console.ReadLine().Split(' ');
        int x1 = Convert.ToInt32(tokens_x1[0]);
        int v1 = Convert.ToInt32(tokens_x1[1]);
        int x2 = Convert.ToInt32(tokens_x1[2]);
        int v2 = Convert.ToInt32(tokens_x1[3]);
        // What needs to be determined is whether there exists an N such that
        // x1 + v1 * N = x2 + v2 * N
        // or, equivalenly, 
        // (x1 - x2) = (v2 - v1) * N 
        double ndouble = ((double)x1 - (double)x2) / ((double)v2 - (double)v1); 
        Console.WriteLine(ndouble == (int)ndouble ? "YES" : "NO");
    }
}

有两个问题:

  1. 浮点数导致舍入误差
  2. 除以零(如@samgak所述)

因此,您的方法变为:

return (x1 == x2) || 
  (((x1 < x2 && v1 > v2) || (x2 < x1 && v2 > v1)) && (x1 - x2) % (v1 - v2) == 0);

如果x1与x2相同,那么我们就不必再看了。 这是v1 == v2和袋鼠相遇的唯一情况。 用模和整数检查第一个数字是否可被第二个数字除,以确保没有舍入错误。 在应用模之前,我们确保袋鼠朝彼此移动而不彼此远离(1%-1 == 0,但正如@zerkms所指出的那样,这不是解决方案)。

这是对此的C解决方案

int main(){
    int x1; 
    int v1; 
    int x2; 
    int v2; 
    scanf("%d %d %d %d",&x1,&v1,&x2,&v2);
    int x = x1-x2,v = v2-v1;
    if((v==0 && x==0)||(x!=0 && v!=0 && x%v==0 && (x*v>=0)))
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM