整数的不同值

Different values for integer

正在尝试在集合 st 和 st1 中插入数字的平方和立方值。 (设 n = 10^7)。
打印后,由于整数限制,集合 st 具有负值,但集合 st1 中没有负值,即使 'i' 和 'temp' 都是整数。

        int n;
        cin >> n;
        int temp = 2;
        set<int> st;
        set<int> st1;

        while ((temp * temp) < n)
        {
            st.insert(temp * temp);
            if ((temp * temp * temp) < n)
            {
                st.insert(temp * temp * temp);
            }
            temp++;
        }

        for(int i=1;i*i<n;i++){
            st1.insert(i * i);
        }
        for(int i=1;i*i*i<n;i++){
            st1.insert(i* i * i);
        }

        for(auto ss : st){
            cout<<ss<<" ";
        }

        cout<<"\n\n";

        for(auto s : st1){
            cout<<s<<" ";
        }

    }

如果 temp * temp 溢出类型,temp * temp < n 的行为未定义。通常会观察到负数环绕,但即使使用这样做的体系结构,也允许优化编译器假设如果 a + c < b + c 用于常量 ca < b.

temp < n / temp 是一种不受溢出影响的常见重构。您当然需要检查 non-zero temp.

一旦第一个立方体达到 10^7,您的 for 循环就会停止。 但是您的 while 循环会继续,直到第一个平方达到 10^7。此时(n=3163)立方体已经超过INT_MAX.