次の仕様を満たすプログラムを教えていただけますか?


~ 仕様 ~
- 引数に、二つの整数(現在と過去)を与える。
- 戻り値として、過去の数値からの増分があればよい。
- 現在の数値は、基本的に過去の数値以上。
- でも、現在の値は64bitで桁あふれして0からリスタートする。
- 2重にループすることは考慮しなくてよい

開発用Linux上なので、php でも c でも perl でも、その他、動けばOKです。
単純な計算だからとシェルスクリプトで64bitを計算しようとして、32bit OSとしての、仕様の壁にぶちあたりました。
snmp v2c 侮りがたし…

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/10/25 14:21:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Bookmarker No.2

回答回数191ベストアンサー獲得回数34

ポイント450pt

引数というのはコマンド引数のことだったんですね。

じゃあ、手っ取り早く Ruby で。

#!/usr/local/bin/ruby


def put_usage
  puts "Usage: #{$0} old_time new_time"
end

def cal_diff_time(old_time, new_time)
  if new_time >= old_time
    return new_time - old_time
  else
    return new_time + (2 ** 64 - old_time)
  end
end


if ARGV.size != 2
  put_usage
  exit 1
end

old_time = ARGV[0].to_i
new_time = ARGV[1].to_i
diff_time = cal_diff_time(old_time, new_time)
puts diff_time
id:KuroNeko666

実行してみました。

求めていた動作でした、本当にありがとうございます。


環境にrubyがなくて、あわててrpmインストールしましたがw


Bシェルにどっぷりハマりすぎてましたね…反省です。

2007/10/25 14:19:47

その他の回答1件)

id:Bookmarker No.1

回答回数191ベストアンサー獲得回数34

ポイント50pt

C99 の場合:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>


uint_least64_t
calc_diff_time(uint_least64_t old_time, uint_least64_t new_time)
{
    if ( new_time >= old_time ) {
        return new_time - old_time;
    }
    else {
        return new_time + (UINT_LEAST64_MAX - old_time);
    }
}

int main()
{
    uint_least64_t old_time = 1, new_time = 0;

    uint_least64_t diff_time = calc_diff_time(old_time, new_time);
    printf("diff time = %" PRIuLEAST64 "\n", diff_time);

    return 0;
}
id:KuroNeko666

ありがとうござますm(__)m


# vi hoge.c

(コピペ)

# gcc hoge.c

# ./a.out 1 1

diff time = 18446744073709551614


ソースをよく見直してみると、引数は自分で書き直さないとですね(^_^;

う~む…

C は苦手… orz

2007/10/25 13:32:47
id:Bookmarker No.2

回答回数191ベストアンサー獲得回数34ここでベストアンサー

ポイント450pt

引数というのはコマンド引数のことだったんですね。

じゃあ、手っ取り早く Ruby で。

#!/usr/local/bin/ruby


def put_usage
  puts "Usage: #{$0} old_time new_time"
end

def cal_diff_time(old_time, new_time)
  if new_time >= old_time
    return new_time - old_time
  else
    return new_time + (2 ** 64 - old_time)
  end
end


if ARGV.size != 2
  put_usage
  exit 1
end

old_time = ARGV[0].to_i
new_time = ARGV[1].to_i
diff_time = cal_diff_time(old_time, new_time)
puts diff_time
id:KuroNeko666

実行してみました。

求めていた動作でした、本当にありがとうございます。


環境にrubyがなくて、あわててrpmインストールしましたがw


Bシェルにどっぷりハマりすぎてましたね…反省です。

2007/10/25 14:19:47
  • id:Bookmarker
    間違い。
    - return new_time + (UINT_LEAST64_MAX - old_time);
    + return new_time + (UINT_LEAST64_MAX - old_time + 1);
  • id:snpgr
    >new_time + (UINT_LEAST64_MAX - old_time)
    繰り下がりが抜けてるような
  • id:snpgr
    リロードしてませんでした。申し訳ないorz
  • id:Bookmarker
    解決したようですが、最初に書いたプログラムがまだバグってたので訂正…orz
    - return new_time + (UINT_LEAST64_MAX - old_time + 1);
    + return new_time + (0xffffffffffffffffULL - old_time + 1);

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません