3

私は次のことをしたい:

変数を使用int aしてコンソールからの入力を保持し、次のことを行います。

int b = a / 16;

aが 64 または 32 の場合、4 または 2 を取得します。しかし、 a63 の場合、4 を取得することを期待していますが、3 を取得します。C で丸められた値を取得する方法はありますか?

編集します。詳細:

rang 1 to 16 should get 1,
rang 17 to 32 should get 2,
rang 33 to 48 should get 3,
rang 49 to 64 should get 4
4

7 に答える 7

2

/C の整数除算では丸めは行われず、代わりに切り捨てが行われます。

于 2013-06-03T08:56:05.597 に答える
0

以下を使用して試すことができます

 int b = (int)ceil((double)a/16);
于 2013-06-03T09:23:55.660 に答える
0

必要なものを取得する最も簡単な方法は、浮動小数点数を使用することです。

#include <math.h>
#include <stdio.h>

int main(void) 
{
  double a = 63.0;
  double b = 16.0;

  printf("%d", (int) round(a / b));

  return 0;
}

float 値から int へ、またはその逆にキャストするときは注意してください。たとえば、round(63/16)は正しくありません。double を返しますが、リテラル 63 と 16 は整数であるため、何も達成しません。除算は、値が関数に渡される前に行われます。正しい方法は、一方または両方のオペランドが double 型であることを確認することです。round(63.0 / 16.0)

于 2013-06-03T09:26:45.547 に答える
0

C の int 除算は常にゼロに向かって丸められるため、均等に丸めるために使用できる簡単な方法は、丸めが行われる前に数値に「0.5」を追加することです。たとえば、32 で割りたい場合は、

x = (a+16)/32;

またはより一般的には、a/b の場合、a と b は両方とも正です。

x = (a+b/2)/b;

残念ながら、結果が負の場合、0.5 を加算するのではなく減算する必要があるため、負の数は少し複雑になります。コードを書いているときに、それが肯定的か否定的かがわかっている場合は問題ありませんが、肯定的答えと否定的答えの両方を扱うと厄介になります。あなたはこのようにすることができます...

x = (a+((a/b>0)?1:-1)*(b/2)) / b;

しかし、その段階までにはかなり複雑になり始めています - float にキャストしてround関数を使用する方がおそらく良いでしょう。

--

[編集] zakinster が指摘したように、質問では「ラウンド」値が求められましたが、与えられた例では実際には が必要ですceil。int でそれを行う方法は次のようになります。

x = (a+b-1)/b;

繰り返しますが、答えが負になる可能性がある場合、これは複雑になります。

x = (a+((a/b>0)?1:-1)*(b-1)) / b;

誰かが興味を持っている場合に備えて、丸めの元の応答を残します。

于 2013-06-03T11:10:30.900 に答える