ページ 1 / 1
2のべき乗
Posted: 2012年1月14日(土) 13:23
by takeru
2の10乗の値を正確に表示しなさい。
2の32乗の値を正確に表示しなさい。
2の64乗の値を正確に表示しなさい。
2の100乗の値を正確に表示しなさい。
2の128乗の値を正確に表示しなさい。
2の140乗の値を正確に表示しなさい。
という問題が出たのですが2の140乗のような大きな値をどのようにすれば
正確に表示できるのか分りません教えていただけませんか?
整数配列を利用し、配列要素に4桁を扱う。とあって、
2の10乗 1024
2の32乗 42 億 おく 9496 万 まん 7296
2の64乗 1844 京 きょう (けい) 6744 兆 ちょう 0737 億 おく 0955 万 まん 1616
2の100乗 126 穣 じょう 7650 予 (予禾) じょ 6002 垓 がい 2822 京 きょう (けい) 9401 兆 ちょう
4967 億 おく 0320 万 まん 5376
2の128乗 340 澗 かん 2823 溝 こう 6692 穣 じょう 0938 予 (予禾) じょ 4634 垓 がい 6337 京 きょう (けい) 4607 兆 ちょう
4317 億 おく 6821 万 まん 1456
2の140乗 139 正 せい 3796 澗 かん 5749 溝 こう 0816 穣 じょう 3946 予 (予禾) じょ 3459 垓 がい 8239 京 きょう (けい) 2040 兆 ちょう
5225 億 おく 9412 万 まん 3776
という結果を表示させたく、いろいろなサイトを調べてみたのですが難しくてよく分かりません。
できるだけ簡単なプログラムにしたいのですがどうしたらよいのでしょうか?ご教授ください。
Re: 2のべき乗
Posted: 2012年1月14日(土) 14:56
by 初級者
改変はご自由にどうぞ。なお、「抒」は、私の字が間違っているかも。
コード:
#include <stdio.h>
#define N (11)
void power(int x, int n, int *a)
{
int i, j;
for (i = 0; i < N; i++)
a[i] = 0;
for (a[0] = 1, i = j = 0; i < n; i++) {
for (j = 0; j < N; j++)
a[j] *= x;
for (j = 0; j < N; j++)
if (a[j] >= 10000)
a[j] -= 10000, a[j+1]++;
}
}
void print(int *a)
{
char *s[N] = { "","万","億","兆","京","垓","抒","穣","溝","澗","正" };
int i;
for (i = N - 1; i >= 0; i--) {
if (a[i])
printf("%d%s", a[i], s[i]);
}
putchar('\n');
}
int main(void)
{
int a[N];
power(2, 10, a), print(a);
power(2, 32, a), print(a);
power(2, 64, a), print(a);
power(2, 100, a), print(a);
power(2, 128, a), print(a);
power(2, 140, a), print(a);
return 0;
}
Re: 2のべき乗
Posted: 2012年1月14日(土) 15:15
by beatle
2のN乗の値を表示しろというのは,何進数で表示しろという指定はあるのでしょうか.
2進数でよければ非常に簡単です.
Re: 2のべき乗
Posted: 2012年1月14日(土) 15:34
by みけCAT
takeru さんが書きました:2の10乗 1024
2の32乗 42 億 おく 9496 万 まん 7296
2の64乗 1844 京 きょう (けい) 6744 兆 ちょう 0737 億 おく 0955 万 まん 1616
2の100乗 126 穣 じょう 7650 予 (予禾) じょ 6002 垓 がい 2822 京 きょう (けい) 9401 兆 ちょう
4967 億 おく 0320 万 まん 5376
2の128乗 340 澗 かん 2823 溝 こう 6692 穣 じょう 0938 予 (予禾) じょ 4634 垓 がい 6337 京 きょう (けい) 4607 兆 ちょう
4317 億 おく 6821 万 まん 1456
2の140乗 139 正 せい 3796 澗 かん 5749 溝 こう 0816 穣 じょう 3946 予 (予禾) じょ 3459 垓 がい 8239 京 きょう (けい) 2040 兆 ちょう
5225 億 おく 9412 万 まん 3776
という結果を表示させたく、いろいろなサイトを調べてみたのですが難しくてよく分かりません。
できるだけ簡単なプログラムにしたいのですがどうしたらよいのでしょうか?ご教授ください。
これを文字列リテラルにしてputsで表示しましょう。
整数配列はついでにほかのことをさせて使いましょう。
Re: 2のべき乗
Posted: 2012年1月14日(土) 16:32
by 初級者
beatle さんが書きました:2のN乗の値を表示しろというのは,何進数で表示しろという指定はあるのでしょうか.
2進数でよければ非常に簡単です.
何をおっしゃっているのか、全くわかりません。
takeru さんが書きました:
という結果を表示させたく、
のところを見ていないのでしょうか。
Re: 2のべき乗
Posted: 2012年1月14日(土) 18:04
by takeru
初級者さん:ご教授ありがとうございます。
コード:
void power(int x, int n, int *a)
{
int i, j;
for (i = 0; i < N; i++)
a[i] = 0;
for (a[0] = 1, i = j = 0; i < n; i++) {
for (j = 0; j < N; j++)
a[j] *= x;
for (j = 0; j < N; j++)
if (a[j] >= 10000)
a[j] -= 10000, a[j+1]++;
}
}
この部分は2の渡されたn乗を求めているだけなんですか?できれば詳しく教えてください。
Re: 2のべき乗
Posted: 2012年1月14日(土) 18:36
by 初級者
コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
もしかすると、beatleさんあたりからもっと効率的なコードが
出てくるかもしれません。
コード:
/*
* power(x, n, a)
* xのn乗を計算し、4桁ごとに配列aに格納する
*/
void power(int x, int n, int *a)
{
int i, j;
// 4桁ごとの値を入れる配列の初期化
for (i = 0; i < N; i++)
a[i] = 0;
// n乗の計算なので、このループはn回まわる
for (a[0] = 1, i = j = 0; i < n; i++) {
// 配列の全要素にxを掛ける
for (j = 0; j < N; j++)
a[j] *= x;
// 各要素が4桁に収まらなくなったら(10000以上になったら)
// 自分からは10000を引いて、となりへ繰り上げる
for (j = 0; j < N; j++)
if (a[j] >= 10000)
a[j] -= 10000, a[j+1]++;
}
}
Re: 2のべき乗
Posted: 2012年1月14日(土) 19:00
by beatle
初級者 さんが書きました:
takeru さんが書きました:
という結果を表示させたく、
のところを見ていないのでしょうか。
仰るとおり見ていませんでした.ごめんなさい.
Re: 2のべき乗
Posted: 2012年1月14日(土) 19:53
by takeru
初級者さん:丁寧に説明していただきありがとうございます。理解することができました。
またなにか違うプログラムで分からないことがあればお聞きするかもしれないのでよろしくお願いいたします。
Re: 2のべき乗
Posted: 2012年1月21日(土) 15:39
by かずま
初級者 さんが書きました:コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
ムダというよりも、バグがあります。
・a[j+1]++で範囲外の a[N] にアクセスしてしまう。
・x が 3以上のとき正しい表示をしない。
例えば、3 の 10乗は 59049 なのに、4万19049 と表示される。
ということで、書き直してみました。これで x は 1~214768 まで OK です。
コード:
void power(int x, int n, int *a)
{
int i, j, c, t;
for (a[0] = i = 1; i < N; i++) a[i] = 0;
for (i = 0; i < n; i++)
for (c = j = 0; j < N; j++)
t = a[j] * x + c, c = t / 10000, a[j] = t % 10000;
}