予選解答プログラム例(C 版) 計算手法は予選結果解説を参照. #include #define COLUMN 100000 /* 1ワードに10進の桁数5桁を格納する */ #define TERM1 6290 /* 計算する項の数 奇数のみのため2倍 */ #define ARRAY 603 /* 多倍長を格納するワード数 */ #define LENG 602 int n, p[ARRAY], a[ARRAY], b[ARRAY]; int rr, xx, i; int carry; add() { /* 多倍長の加算 */ carry = 0; for( i = LENG; i >= 0; i--){ p[i] = p[i] + b[i] + carry; carry = 0; if( p[ i] < COLUMN) continue; p[i] -= COLUMN; carry = 1; } } div9() { /* 多倍長の除算 9の冪乗の逆数 */ rr = 0; /* 直前の項を9で割る */ for( i = 0; i < ARRAY; i++) { xx = a[i] + rr * COLUMN; a[i] = xx / 9; rr = xx - 9 * a[i]; /* 余りの計算に剰余(%演算子)は */ } /* 使用しない*/ } divn() { /* 多倍長の除算 (2k-1)の逆数 */ rr = 0; for( i = 0; i < ARRAY; i++) { xx = a[i] + rr * COLUMN; b[i] = xx / n; rr = xx - n * b[i]; } } main( argc, argv) int argc; char *argv[]; { /* 初期設定 第1項の計算 2÷3を代入 */ for( i = 1; i < ARRAY; i++) p[i] = a[i] = 66666; n = 3; /* 第2項 2*2 - 1 = 3 から開始 */ while( n < TERM1 ) { div9(); /* a = a / 9 */ divn(); /* b = a / n */ add(); /* p = p + b */ n += 2; /* (2*k - 1) の乗算と減算をやめる */ } printf( "%d.", p[ 0]); for( i = 1; i < 601; i++) printf( "%05d", p[ i]); }