// pi.c 2010-11-14 Hatada // πの値を指定桁まで算出 #include #include int series(int *data, int keta, int maxItem, int bunsi, int bunbo, int plusMinus) { int bunbo2; int *item; int *itemDiv; int len; int i, j, k; int x; len = (keta-1)/4 + 2 + 1; if ((item = malloc(len * sizeof(int))) == 0) return -1; for (i = 0; i < len; i++) item[i] = 0; if ((itemDiv = malloc(len * sizeof(int))) == 0) { free(item); return -1; } item[0] = bunsi * bunbo * 4; bunbo2 = bunbo * bunbo; for (j = 1; maxItem--; j += 2) { x = 0; for (i = 0; i < len; i++) { x = x * 10000 + item[i]; item[i] = x / bunbo2; x = x % bunbo2; } if (j == 1) { for (i = 0; i < len; i++) itemDiv[i] = item[i]; } else { x = 0; for (i = 0; i < len; i++) { x = x * 10000 + item[i]; itemDiv[i] = x / j; x = x % j; } } k = 0; if (plusMinus & 1) { for (i = len; --i >= 0; ) { data[i] += itemDiv[i] + k; if (data[i] < 10000) k = 0; else { data[i] -= 10000; k = 1; } } } else { for (i = len; --i >= 0; ) { data[i] -= itemDiv[i] + k; if (data[i] >= 0) k = 0; else { data[i] += 10000; k = 1; } } } plusMinus++; } free(itemDiv); free(item); return 0; } int pi(int *data, int keta) { int maxItem_5 = keta * 500 / 699 + 2; int maxItem_239 = keta * 500 / 2378 + 2; int i; for (i = 0; i < (keta-1)/4+2; i++) data[i] = 0; if (series(data, keta, maxItem_5, 4, 5, 1) != 0) return -1; if (series(data, keta, maxItem_239, 1, 239, 0) != 0) return -1; return 0; } void main(int argc, char *argv[]) { char* pai = "3.1415 9265 3589 7932 3846 2643 3832 7950 2884 1971 " "6939 9375 1058 2097 4944 5923 0781 6406 2862 0899 " "8628 0348 2534 2117 0679 8214 8086 5132 8230 6647"; int k; int* data; int n; if (argc > 1) { n = atoi(argv[1]); } else { printf("桁数(4の倍数)="); scanf("%d", &n); } printf("n=%d\n", n); data = calloc(n*10, 1); // いくら必要か吟味していない pi(data, n); for (k = 0; k < (n-1)/4 + 2; k++) { printf("%04d ", data[k]); } printf("\n解:%s\n", pai); } // http://bal4u.dip.jp/mt/program/2004/08/pi.html