2のべき乗

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
takeru

2のべき乗

#1

投稿記事 by takeru » 13年前

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

という結果を表示させたく、いろいろなサイトを調べてみたのですが難しくてよく分かりません。
できるだけ簡単なプログラムにしたいのですがどうしたらよいのでしょうか?ご教授ください。

初級者
記事: 200
登録日時: 14年前

Re: 2のべき乗

#2

投稿記事 by 初級者 » 13年前

改変はご自由にどうぞ。なお、「抒」は、私の字が間違っているかも。

コード:

#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;
}

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 2のべき乗

#3

投稿記事 by beatle » 13年前

2のN乗の値を表示しろというのは,何進数で表示しろという指定はあるのでしょうか.
2進数でよければ非常に簡単です.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 2のべき乗

#4

投稿記事 by みけCAT » 13年前

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で表示しましょう。
整数配列はついでにほかのことをさせて使いましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

初級者
記事: 200
登録日時: 14年前

Re: 2のべき乗

#5

投稿記事 by 初級者 » 13年前

beatle さんが書きました:2のN乗の値を表示しろというのは,何進数で表示しろという指定はあるのでしょうか.
2進数でよければ非常に簡単です.
何をおっしゃっているのか、全くわかりません。
takeru さんが書きました: という結果を表示させたく、
のところを見ていないのでしょうか。

takeru

Re: 2のべき乗

#6

投稿記事 by takeru » 13年前

初級者さん:ご教授ありがとうございます。

コード:

 
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乗を求めているだけなんですか?できれば詳しく教えてください。

初級者
記事: 200
登録日時: 14年前

Re: 2のべき乗

#7

投稿記事 by 初級者 » 13年前

コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
もしかすると、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]++;
    }
}

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 2のべき乗

#8

投稿記事 by beatle » 13年前

初級者 さんが書きました:
takeru さんが書きました: という結果を表示させたく、
のところを見ていないのでしょうか。
仰るとおり見ていませんでした.ごめんなさい.

takeru

Re: 2のべき乗

#9

投稿記事 by takeru » 13年前

初級者さん:丁寧に説明していただきありがとうございます。理解することができました。
      またなにか違うプログラムで分からないことがあればお聞きするかもしれないのでよろしくお願いいたします。 

かずま

Re: 2のべき乗

#10

投稿記事 by かずま » 13年前

初級者 さんが書きました:コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
ムダというよりも、バグがあります。

・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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る