問:以下のソースを全く同じ動作をするコードを書け。(定数時間)
-----
auto CTest1::TestFunction(unsigned int a, unsigned int b)->unsigned int{
unsigned int ret = 0;
for(unsigned int i = a; i <= b; ++i){
ret += i;
}
return ret;
}
-----
俺には書けなかった・・・
TestFunction(0xfffffffe, 0xfffffffe);
TestFunction(n, 0xffffffff);
あたりを再現できるかが肝心だな。
多分無理だと思うのだが。
class ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int = 0;
};
class CTest1 : public ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int;
};
class CTest2 : public ITest{
public:
virtual auto TestFunction(unsigned int a, unsigned int b)->unsigned int;
};
auto CTest1::TestFunction(unsigned int a, unsigned int b)->unsigned int{
unsigned int ret = 0;
for(unsigned int i = a; i <= b; ++i){
ret += i;
}
return ret;
}
auto CTest2::TestFunction(unsigned int a, unsigned int b)->unsigned int{
if(a <= b){
//普通
unsigned int n = b - a + 1;
unsigned int s = a + b;
if(n & 1){
//項数が奇数
return (s >> 1) * n;
}else{
//項数が偶数
return (n >> 1) * s;
}
}else{
//まず来ない
return 0;
}
}