0

/記号なしで除算を行う関数を作成しようとしています

long  q(int nm1, int nm2)
{
  long q = 0;

   while ( num1 > num2)
    {
    some subtraction here    
    }
return q;

}

アイデアは、入力が正しいと仮定し、最初のものを 2 番目のもので割ることです。これは、秒が最初の数値よりも小さくなるまで、最初の数値から秒を減算することを意味します。

これを行うためにさまざまな方法を試しましたが、何らかの理由でヒットできません。

今のところ、数値が正であり、ゼロ除算を返さないと仮定しています (後で他の関数を呼び出すことで修正できます)。

4

5 に答える 5

3

これは、秒が最初の数値よりも小さくなるまで、最初の数値から秒を減算することを意味します。

そして、それの何が問題なのですか?

int div(int num, int den)
{
    int frac;
    for (frac = 0; num >= den; num -= den, frac++)
        ;

    return frac;
}
于 2013-03-02T06:30:23.833 に答える
1

あなたが最初の投稿でやろうとしているのは、繰り返し減算アルゴリズムによる除算です。ウィキペディアを見てください:

ユークリッド原論、ブックVII、提案1に示されている最大公約数アルゴリズムに歴史的に組み込まれている最も単純な除算アルゴリズムは、減算と比較のみを使用して、2つの正の整数が与えられた余りを見つけます。

while  N ≥ D do
  N := N - D
end
return N

whileループにカウンターを追加して、反復回数(戻りたいもの)を追跡します。ループの後に、Nに余りが含まれます(もちろん0でない場合)。

于 2013-03-02T07:23:26.647 に答える
1

このコードは、num と den が整数値の場合にのみ機能します。

int main( int num, int den )
    {
        if(den==0)
        {
            return 1;
        }
        else
        {
            while(num!=0)
            {
                num = num - den;    
            }
        }
       return 0;         
    }
于 2013-03-02T09:46:35.330 に答える
0

上記の回答を少し改善するだけです。モジュラスを使用

long div(int num, int den)
{
    int frac;
    int num2 = num;

    for (frac = 0; num2 >= den; num2 -= den, frac++)
        ;
// i needed the original num and den. 

  return ( (long) frac )+( num % den );

// casts frac to long then adds the modulus remainder of the values.
}
于 2013-03-02T06:57:23.397 に答える
0

ほんの少しの最適化: 入力値に線形時間の複雑さを持たせたくありません

int div(int num, int den)
{
    int result = 0;
    int i;
    long long x;
    long long y;
    if (num < 0) return -div(-num, den);
    if (den < 0) return -div(num, den);
    if (num < den) return 0;

    x = num;
    y = den;
    i = 0;
    while((i < 32) && (x > (y << (i+1)))) i++;
    for(;i>0; i++)
    {
       if (x > (y << i))
       {
           x -= y;
           result += 1 << i; 
       }
    } 

    return result;
}
于 2013-03-02T11:25:56.153 に答える