i < N+1和i <= N是不同的吗?

4

我曾经认为i <= Ni < N+1没有区别
但是当我在程序中输入6 6时,
如果i <= N则打印:

1 6 6
6 1 1
2 3 3
3 2 2

否则打印:

1 6 6
6 1 1
2 3 3
3 2 2
3 2 2
2 3 3


我弄不清楚为什么会有这样的差别

#include <iostream>
#include <cmath>

using namespace std;

typedef long long LNT;

LNT gcd(LNT a, LNT b)
{
    if( b == 0)
        return a;

    return gcd(b, a%b);
}

int main()
{
    LNT red, green;
    LNT GCD;
    cin >> red >> green;

    GCD = gcd(red, green);

    //for(LNT i = 1; i<sqrtl(GCD)+1; i++)
    for(LNT i = 1; i<=sqrtl(GCD); i++)   // <- This Line cause the difference 
    {
        if( GCD % i == 0)
        {
            cout << i << " " << red/i << " " << green/i <<endl;
            if( i != GCD/i )
            {
                LNT k = GCD/i;
                cout << k << " " << red/k << " " << green/k <<endl;
            }
        }
    }
}

3
如果 N == MAX_INT_VALUE,那么 N+1 就会溢出并且它们是不同的。 - csharpfolk
@csharpfolk:在C中,这将是INT_MAX,在C++中,这将是std::numeric_limits<int>::max()。溢出会使INT_MAX+1未定义,因此您无法再对其进行推理,但是假设N是int的话,N <= INT_MAX也相当无意义。 - MSalters
3个回答

15

这仅适用于整数值。由于sqrtl返回long double,如果它是分数,则对于分数部分,将仍然存在差异,如果您将原始值与比其大一个整数的值进行比较:

! 2 <= 1.5
2 < 1.5+1

我曾经对for循环有一个误解。我以为它会隐式转换为非浮点类型。谢谢! - astrohsy
更新:for循环将比较的结果转换为intbool。(这就是为什么不应该问C/C++问题的原因:C和C++之间存在微妙的差异。) - MSalters
@MSalters:我认为Eureuerung所说的是比较的右侧而不是整个条件。 - Zbynek Vyskovsky - kvr000
@ZbynekVyskovsky-kvr000:for循环可以包含几乎任何表达式作为其条件表达式。哪些子表达式的部分将被强制转换?例如for (char* p = ...; p && *p; ...)不是一个不寻常的条件表达式。 - MSalters

2

sqrtl返回long double类型。在这种情况下,你的假设:

i <= Ni < N+1没有区别。

是错误的。


1
哦...我发现当我将sqrtl(GCD)转换为(long long)时,它可以正常工作,谢谢! - astrohsy

0

嗯,i<=ni < n+1之间没有区别,因为它们都只运行到n,但你所做的是求平方根,它返回的是长双精度数,它们不一定相同。


在某些情况下会有所不同。请参考被接受的答案。 - Box Box Box Box

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接