Mist氏の補足がなければ、私にも仕様が分からなかったな。
30分もかかってしまった。orz
a[/url]の使い方が逆順なのは私の好みです。許してね。
#include <stdio.h>
#define N 20
#define BITS 16
#define LIMIT 100000
typedef unsigned short uint16;
int PrintMpa(const uint16 a[N]) {
int sum[N], buf[N], i, j;
// 合計と2^xの初期化
for (i = 0; i < N; i++)
sum = buf = 0;
buf[0] = 1;
// a[N]のビットの数だけループ
for (i = 0; i < N * BITS; i++) {
printf("%d : \n", i);
// sum += 2^i
if (a[i / BITS] & (1 << (i % BITS))) {
for (j = 0; j < N; j++) {
sum[j] += buf[j];
if (sum[j] > LIMIT) {
sum[j] -= LIMIT;
sum[j + 1]++;
}
}
}
// 2^i を更新
for (j = 0; j < N; j++)
buf[j] *= 2;
for (j = 0; j < N; j++)
if (buf[j] > LIMIT) {
buf[j] -= LIMIT;
buf[j + 1]++;
}
}
// 表示
for (int i = N - 1; i >= 0; i--)
printf("%05d ", sum);
printf("\n");
return 0;
}
int main()
{
uint16 a[N];
int i;
// a[0]が一番小さい位
for (i = 0; i < N; i++)
a = 0;
a[1] = 0x1;
a[0] = 0xFFFF;
PrintMpa(a);
return 0;
}