14

%ほとんどのプログラミング言語に存在するモジュラス演算子を使用してこれを実現できると聞いています。本当の問題は、どうやって?私はモジュラスがどのように機能するのかよく知らないので、過去にそれを使用するのに苦労しました。ここで1970年からの現在の時刻を秒単位で考えると、1307758473.484何年、つまり日、つまり時間、およびモジュラスを使用している分をどのように計算できますか?

基本的に、「5年、10日、12時間、7分、18.56秒」のようにフォーマットすることを検討しています。どうすればいいですか?私はこの背後にあるロジックを学ぶことに本当に興味があり、単純なドロップインソリューションには興味がありません。

4

3 に答える 3

29

整数除算を行うと、商と剰余が得られます。例えば、

5 divided by 3 is quotient 1 with remainder 2.

プログラミング言語では、これは通常次のように表されます。

5 / 3   # => 1
5 % 3   # => 2

必要な変換は、これを繰り返すだけです。下のユニットから始めて、上に行く方が簡単です

まず、あなたは

  • 1307758473.484 seconds

60秒は1分なので、

1307758473.484 / 60 = 21795974  (intended to be integer division)
1307758473.484 % 60 = 33.484,

それはと同じです

  • 21795974 minutes 33.484 seconds

60分は1時間なので、

21795974 / 60 = 363266
21795974 % 60 = 14

それはさらに同じです

  • 363266 hours 14 minutes 33.484 seconds

さて、少し難しさがあります。ほとんどの日は24時間です。うるう秒がある場合、そうではありません。うるう秒を無視し、1日が24時間であると仮定すると、計算を行うことにより、

363266 / 24 = 15136
363266 % 24 = 2

それはさらに同じです

  • 15136 days 2 hours 14 minutes 33.484 seconds

同様に、ほとんどの年は365日です。うるう日(年)がある場合はありません。飛躍日を無視し、1年が365日であると仮定すると、計算を行うことにより、

15136 / 365 = 41
15136 % 365 = 171

それはさらに同じです

  • 41 years 171 days 2 hours 14 minutes 33.483 seconds
于 2011-06-11T03:03:39.607 に答える
3

モジュラスは、整数除算を実行するときに余りを返します。

最初に問題を逆方向に処理することで、Modの使用方法を理解するのが最も簡単だと思います。

時間、分、秒から始めましょう。正確には1時間、10分、30秒です。

まず、30秒あります。これは簡単です-たった30です。簡単です。次に、分を追加します。分を秒として決定するには、60を掛けます。したがって、10分30秒=630秒です。

これで、modがどのように機能するかがわかります。630を60で割ると10.5になりますが、分数(整数の除算)を無視すると10になります。残りは秒です。

したがって、MOD 630を60で割ると、30になります。630を30で割ったときの余りです。

したがって、分と秒を決定するには、分を60で除算し、秒を60で除算します。

ここで1時間を追加します。1時間=60分60分は60*60秒なので、1時間=3600秒です。3600 + 600 + 30=4230秒。

4230/3600(1時間)= 1-つまり、1時間あります

4230%(mod)3600 = 630-これを取得すると、数分間処理されます。

したがって、これをさらに具体化して1日を追加すると-1日=24時間=24 * 3600 = 86400 86400 + 3600 + 600 + 30 = 90630

90630/86400 =1->1日

90630%86400=4230->残り秒数

4230/3600 =1->1時間

上記のロジックを繰り返します。

それがそれをクリアするのに役立つことを願っています-あなたはその反復をさらに繰り返し続け、数週間と数年を行うことができますが、月は不規則であるため特別であり、うるう年もそうです。

于 2011-06-11T02:27:17.657 に答える
1

小さな基本単位(秒)から一連の大きな単位(分/時間/日/年/数十年/世紀/千年)に変換するときはいつでも、モジュロ(%)演算子を使用して、残りの基本単位を追跡できます。各大きなユニットを抽出します。

これは、ある種の現在の合計を基本単位で維持するためのエレガントでシンプルな方法です。必要な最大のユニットでBaseUnitの抽出を開始し、元のBaseUnitに到達するまで下に戻ります。

これは、抽出された単位がゼロ以外の場合にのみ機能します。ゼロの場合、基本単位はまったく抽出されておらず、モジュロ演算子は必要ありません。

モジュロ演算の結果は常に元の基本単位になることを覚えておくことが重要です。それは混乱する可能性があります。

100万秒をより大きな時間単位として言い換えましょう。1年=31,536,000秒とし、うるう年やその他のカレンダー調整は行いません。

#include <cstdio>
#define SEC2CENT 3153600000
#define SEC2DEC 315360000
#define SEC2YR 31536000
#define SEC2MONTH 2592000
#define SEC2WEEK 604800
#define SEC2DAY 86400
#define SEC2HOUR 3600
#define SEC2MIN 60
main()
{
unsigned int sec = 1000000; //I am 1 million seconds old or...

unsigned int centuries = sec / SEC2CENT;
if (centuries) sec = sec % SEC2CENT; //if nonzero update sec

unsigned int decades = sec / SEC2DEC;
if (decades) sec = sec % SEC2DEC; //the purpose of modulo for units is this running total of base units

unsigned int years = sec / SEC2YR;
if (years) sec = sec % SEC2YR;

unsigned int months = sec / SEC2MONTH;
if (months) sec = sec % SEC2MONTH;

unsigned int weeks = sec / SEC2WEEK;
if (weeks) sec = sec % SEC2WEEK;

unsigned int days = sec / SEC2DAY;
if (days) sec = sec % SEC2DAY;

unsigned int hours = sec / SEC2HOUR;
if (hours) sec = sec % SEC2HOUR;

unsigned int minutes = sec / SEC2MIN;
if (minutes) sec = sec % SEC2MIN;

unsigned int seconds = sec; //seconds should now be less than 60 because of minutes

printf("I am now exactly %u centuries, %u decades, %u years, %u months, %u weeks, %u days, %u hours, %u minutes, %u seconds old and that is very old indeed.", centuries, decades, years, months, weeks, days, hours, minutes, seconds);
}
于 2019-03-25T08:13:45.557 に答える