Trying to insert values of square and cube of a number in set st and st1. (Let n = 10^7).
After printing, set st is having negative values due to limit of integer but there are no negative values in set st1 even though both 'i' and 'temp' are integers.
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<<" ";
}
}
CodePudding user response:
The behaviour of temp * temp < n
is undefined if temp * temp
overflows the type. Wraparound to negative is commonly observed but even with architectures that do that, optimising compilers are permitted to assume that if a c < b c
for a constant c
then a < b
.
temp < n / temp
is a common refactoring that does not suffer from that overflow. You do of course need to check for non-zero temp
.
CodePudding user response:
Your for loop stops once the first cube reaches 10^7. But your while loop continues until the first sqare reaches 10^7. At this point (n=3163) the cube already exceeded INT_MAX.