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
という結果を表示させたく、いろいろなサイトを調べてみたのですが難しくてよく分かりません。
できるだけ簡単なプログラムにしたいのですがどうしたらよいのでしょうか?ご教授ください。
2のべき乗
Re: 2のべき乗
改変はご自由にどうぞ。なお、「抒」は、私の字が間違っているかも。
#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のべき乗
2のN乗の値を表示しろというのは,何進数で表示しろという指定はあるのでしょうか.
2進数でよければ非常に簡単です.
2進数でよければ非常に簡単です.
Re: 2のべき乗
これを文字列リテラルにしてputsで表示しましょう。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
という結果を表示させたく、いろいろなサイトを調べてみたのですが難しくてよく分かりません。
できるだけ簡単なプログラムにしたいのですがどうしたらよいのでしょうか?ご教授ください。
整数配列はついでにほかのことをさせて使いましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 2のべき乗
コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
もしかすると、beatleさんあたりからもっと効率的なコードが
出てくるかもしれません。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
もしかすると、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のべき乗
仰るとおり見ていませんでした.ごめんなさい.初級者 さんが書きました:のところを見ていないのでしょうか。takeru さんが書きました: という結果を表示させたく、
Re: 2のべき乗
ムダというよりも、バグがあります。初級者 さんが書きました:コメントを入れてみました。もし、わかりにくければ、おっしゃってください。
まあ、私のような初級者が書いたコードですから、ムダは多いでしょう。
・a[j+1]++で範囲外の a[N] にアクセスしてしまう。
・x が 3以上のとき正しい表示をしない。
例えば、3 の 10乗は 59049 なのに、4万19049 と表示される。
ということで、書き直してみました。これで x は 1~214768 まで OK です。