Leetcode может бросить вызов: проверьте, прямая ли это линия - PullRequest
0 голосов
/ 08 мая 2020

Вот мой код проблемы: Проверить, прямая ли это

 bool checkStraightLine(vector<vector<int>>& a) {
        double m = (((double)a[1][1]-a[0][1])/(a[1][0]-a[0][0]));

        for(int i=1;i<a.size()-1;i++)
        {

                double slope=(((double)a[i][1]-a[i+1][1])/(a[i][0]-a[i+1][0]));

                if( m!=slope)
                    return false;
        }
        return true;
    }

Я сомневаюсь, почему мой код выдает ошибку при замене:

double m = (((double)a[1][1]-a[0][1])/(a[1][0]-a[0][0]));

с

double m = (double)((a[1][1]-a[0][1])/(a[1][0]-a[0][0]));

и

double slope=(((double)a[i][1]-a[i+1][1])/(a[i][0]-a[i+1][0]));

с

double slope=(double)((a[i][1]-a[i+1][1])/(a[i][0]-a[i+1][0]));

1 Ответ

3 голосов
/ 08 мая 2020

Дано:

int a = 1 , b = 2;

эта строка кода:

double d = (double)(a/b);  // d is 0.

это не то же самое, что:

double d = ((double)a/b);  // d is 0.5

In в первом случае вы выполняете целочисленное деление перед преобразованием результата.

Во втором случае вы преобразуете числитель в double, а затем деление, что делает деление с плавающей запятой.

В вашем случае ошибка может возникнуть из-за того, что код ожидает ненулевого наклона, но целочисленное деление дает вам ноль.

Обратите внимание, что это сравнение:

 if( m!=slope)

в корне ошибочен. Вы никогда не должны сравнивать числа с плавающей запятой на предмет равенства. Вместо этого используйте порог для сравнения.

...