トップ «前の日記(2013-05-05(Sun)) 最新 次の日記(2013-05-07(Tue))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2013-05-06(Mon) ♪今日もいい天気~

負の数

いつから勘違いしていたか、よく思い出せない。
高校数学の教科書をめくってみたら、-3 の二乗は -9 になると書いてあった。(-3) の二乗が 9 になる。

-3 を、(-3) と見なすものは Smalltalk と Lisp系諸言語、それにbc(1)といったところか。

GNU Smalltalk ready
 
st> -3 raisedTo: 2
9
 
(expt -3 2)
9
 
$ echo -3^2 | bc
9

スクリプト言語は大体、教科書に同じ、みたいだ。

$ gawk 'BEGIN{print -3**2}'
-9
 
$ perl -e 'print -3**2, "\n"'
-9
 
$ ruby -e 'puts -3**2'
-9
 
$ python -c 'print -3**2'
-9
 
R version 2.14.1 (2011-12-22)
> -3 ** 2
[1] -9

<補足>
Smalltalk は、"-" という単項メッセージの方が、"raisedTo:" という キーワードメッセージより強いからだろう( メッセージの優先順位)。
LISP なら -3 もアトムのはずだ。
bc(1)は、マニュアル読んだだけではいまいちピンとこなかった。
スクリプト言語についていえば、単項演算子 "-" より 二項演算子の "**" の優先度が高いらしいことに よる模様。 perldocとか Python の doc 、 それに Ruby リファレンスマニュアルに記述あり。
もちろん、変数に代入すれば (-3) となるはずだ。
</補足>

C言語もそうだった。

#include<stdio.h>
#include<math.h>
int main()
{
  double x = -3;
  double n = 2;
  double p = pow(x, n);
  printf("%2.0f\n", p);
  return 0;
}
$ gcc -Wall -o powr powr.c -lm && ./powr 
 9

man 3 pow で-lm に気づくまで、"undefined reference to `pow' " に頭を抱えていた。

おまけ。php もそうだった。
あと何があるんだろうなぁ。

$ php -r 'echo pow(-3, 2) . "\n";'
9

<補足>
変数に代入したせいかもしれない。そんな演算子がなければ、 そうするしかないだろう。
</補足>

暗算で解くか、それとも

予算消化問題。予算と合計数だけ決まってる場合、 単価の高いの(優先)と安いのとを それぞれ幾つにするか。

どうもシミュレーションがうまくできないので、 まずpython3でやってみた。

#!/usr/bin/env python3
 
all = 15
money = 10000
 
for x in range(all,1,-1):
  rest = money - (700 * x + 500 * (all - x))
  if rest gt; 0 and rest < 700:
    print('Lunch_A(700) is {}'.format(x))
    print('Lunch_B(500) is {}'.format(15 - x))
    print('Total is {}'.format(money - rest))
    break
=>
Lunch_A(700) is 12
Lunch_B(500) is 3
Total is 9900

解けるまでひとしきり試行錯誤した後、少し手を入れた。
次にEmacsLispを使って見た。

(defun lunch(money all lunch_A lunch_B)
  (cond
   ((< (+ (* lunch_A all) (* lunch_B (- 15 all))) money)
    (list (cons 'Lunch_A@700  all)
          (cons 'Lunch_B@500 (- 15 all))
          (cons 'Total (+ (* lunch_A all)
                            (* lunch_B (- 15 all))))))
   (t
    (lunch money (- all 1) lunch_A lunch_B))))
 
(lunch 10000 15 700 500)
((Lunch_A@700 . 12) (Lunch_B@500 . 3) (Total . 9900))

再帰もう一つ

#include<stdio.h>
int factr(int n)
{
  if (n == 1)
    return 1;
  else
    n = n * factr(n - 1);
  return n; 
}
  
int main()
{
 int n = 5;
 n = factr(n);
 printf("%d\n", n);
 return 0;
}
 
./a.out
120

リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。