2009-05-18 23 views

答えて

13

私のオリジナルのシンプルなソリューション:

1. print((abs(Number)+Number)/2) 

数が非常に大きい場合を除きソリューションは、ほとんどのケースで動作します(半分以上最大例えば数> = MAX_INT/2)、加算するとオーバーフローが発生する可能性があります。

は、以下の溶液がオーバーフローの問題を解決する:

2. print((abs(Number)/2) + (Number/2)) 

しかし、数であり、整数のままでなければならない場合があってもよく、除算演算子(/)は整数除算であり、/ 7よう2 = 3となる。この場合、ソリューション2は機能しません。なぜなら、Number = 7の場合、6が出力されるからです(この場合、ソリューション1は正常に動作します)。

我々は大きな数字と整数演算の両方に対処する必要があるのであれば、以下の怪物が奇数の場合には2で除算して失われることがあり、その1の補償を追加し、救助に来る:

3. print( 
    ((abs(Number)/2)+(Number/2)) + 
    ((
     (Number-(2*(Number/2))) + 
     (abs(Number)-(2*(abs(Number)/2))) 
    )/2) 
    )   
+1

オーバーフローが発生する可能性があります。 –

+0

@malach:オーバーフローの意味は? –

+0

数値+数値>対応するタイプの最大値 –

9
print max(0, number) 
+0

C/C++では、print(number <= 0?0:number)のようになります。これには比較が含まれます。 –

+0

しかし、PHP、Ruby、Python、Java、C#などの構文に若干の違いがありますが、動作します。 – soulmerge

+3

それが比較であり、組み込み関数でない場合、sign()とabs()も同様です。 – soulmerge

-2

CまたはC++を仮定:

switch ((unsigned long)Number & ~(unsigned long)LONG_MAX) { 
    case 0: 
     printf("%d\n", Number); 
     break; 
    default: 
     printf("0\n", Number); 
     break; 
} 

あなたはスイッチを条件演算子であることを考慮すれば、この試してみてください。

unsigned long flag = (unsigned long)Number & ~(unsigned long)LONG_MAX; 
flag /= (unsigned long)LONG_MAX + 1; 
flag = 1 - flag; 
printf("%d\n", Number * flag); 
+1

私は古典的な比較を交換すると考えています –

+0

switch/case文は "条件なしまたは比較演算子なし"の要求に失敗しませんか? – none

+0

スイッチはオペレータではありません。それは声明です。 – bdonlan

0

まだ完全なドメインに有効な解決法は見ていません。

他の解決策は、入力値が0または0を下回っている場合は、例外と印刷0

をキャッチそれとも、返す関数サインを、-1使用できる例外を発生させる機能を呼び出すことです入力が<の場合は0、0の場合は0、そうでない場合は1です。

print ((sign(x)+1) * sign(x)/2) * x. 

記号はそれほど((記号(X)+1)*記号(X)/ 2)、-1、0又は1であることができる以下の値を有することができる。

-1 -> ((-1+1)*-1)/2 = 0 
0 -> ((0+1)*0)/2 = 0 
1 -> ((1+1) * 1)/2 = 1 

別の方法すべての負でない数値を自分自身にマッピングし、残りを0にマッピングするルックアップテーブルを作成することです。

しかし、私の意見では、元の関数ははるかに明確です。それではなぜKISSの原則に違反するのですか?

+0

それはインタビューの質問です:)確かにそれを指摘してください(元の関数はるかに明確です)、あなたのコーディング原則ではなく、あなたの創意工夫や何かをテストしたいと考えています。 – Ant

+0

私は知っていますが、時々彼らはあなたが質問しない質問に答えることを望みます。それ以外に、もしあなたがそうでない限り、あなたがあなたのインヴァージョンに賢い行動を起こせば、それは決して害を与えません。 –

9

数字が8ビットの2の補数の整数で表されるとします。 0すべてを含む

正の数は0

負の数すべてにMSBを設定しているので、我々はMSBの補数を取る1.

にMSBが設定されている、完全な8ビットに拡張、ビット単位で元の数とANDします。

ポジティブ:

00110101 -

00110101拡張MSBの>補体 - - > MSBが0

11111111である>ビット単位のANDは、負

上述:

10110101 - > MSBは1

00000000 - > MSBの補数は

00000000拡張 - >ビット単位を、必要に応じ

上記ませ比較の - 私は、ビット単位を想定しての一種だと厳密に比較ではありません。

また、コードの不足で申し訳ありませんが、あなたはそのアイデアを得ます。

+1

+1浮動小数点用ではなく、整数用の優れたソリューション。私はバイナリ数学が大好きです:) –

0

受け入れられた回答に似ています。絶対値が比較を使用して実装されているが、オーバーフローする傾向がある場合は許容されますが、

print((sqrt(Number * Number)+ x)/ 2);