2016-09-21 7 views
0

符号に関係なく、実際の値を正の定数で割ったものを最も近い下位の整数に並べる必要があります。例切り捨てではなく切り捨てを行う部分

21,5 \ 2 = 10 
-21,5 \ 2 = -11 
52,3 \ 2 = 26 
-52,3 \ 2 = -27 

(ここではバックスラッシュは私の希望するオペレータを表します)です、これを行い、短い作業はありますか?通常のスラッシュ( "/")演算子はC++(以前は標準化されていた)でゼロに向かって丸められます(例えば-52.6/2 = -26)。

+4

'std :: floor(a/b)' – Leon

+1

C++にそのような演算子がありません –

+0

浮動小数点除算はまったく丸めを行いません。 '-52.6/2'は' -26.30000000000000071054273576010018587112427'です。 – molbdnilo

答えて

2

std::floorが問題を解決します。

#include <iostream> 
#include <cmath> 
using namespace std; 

int main() { 
    // your code goes here 
    float i = -21.5,b=2; 
    int c = std::floor(i/b); 
    cout << c << endl; 

    i = 21.5,b=2; 
    c = std::floor(i/b); 
    cout << c << endl; 

    int a = 11,b1 =2; 
    c = std::floor(a/b1); 
    cout << c << endl; 

    a = -11; 
    b =2.1; 
    c = std::floor(a/b); 
    cout << c << endl; 
    return 0; 
} 

出力:

-11 
10 
5 
-6 
0

我々はそれのための特別な演算子を持っていないが、私たちは特別なタイプを作ることができ、かつ適切な演算子を再定義:

#include <iostream> 
#include <cmath> 

template<class Integer> 
struct RoundDown 
{ 
    RoundDown(Integer v) : value_(v) {} 

    operator Integer&() { return value_; } 
    operator const Integer&() const { return value_; } 

    template<class Other> 
    RoundDown& operator/=(Other const& o) 
    { 
     value_ = Integer(std::floor(double(value_)/o)); 
     return *this; 
    } 

    Integer value_; 
}; 

template<class IntegerL, class IntegerR> 
auto operator/(RoundDown<IntegerL> l, IntegerR const& r) 
{ 
    return l /= r; 
} 

int main() 
{ 
    RoundDown<int> a { -57 }; 
    a /= 2; 
    std::cout << a << '\n'; 
    std::cout << (a/2) << '\n'; 
} 

予想される出力:

-29 
-15 
+0

OPは実数を整数ではなく整数で除算したいと考えました。私は、関数がクラスよりも直感的であると思う。 – anatolyg

+0

@anatolyg奇妙なことに、テンプレート引数が 'Integer'と呼ばれていても、このクラスは実数に対しても機能します。しかし、私はあなたが直感について正しいと確信しています。 –

関連する問題