#include #define i_MAX 25000 #define MAX 30000 int syou = 0; int amari = 0; int z[MAX]; int f[MAX]; int c[MAX]; int b[MAX]; int a[MAX]; int x[MAX]; /* 分子が16の方の最終回答 */ int y[MAX]; /* 分子が 4の方の最終回答 */ int s; int j; int k; int syou1; int syou2; int v; int n ; int main() { int i = 1; for(s = 2; s <= MAX-1; s++) a[s] = 0; a[0] = 1; a[1] = 6; // 16/5 を計算 v = 5; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; a[n] = syou; n++; } // 3.2/25 をする v = 25; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを3で割る i += 2; v = i; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // a[] - b[] for (j = 0; j <= MAX-1; j++) f[j] = 0; j = MAX-1; while (j >= 1) { if ((a[j] - b[j] - f[j]) >= 0) f[j] = (a[j] - b[j] - f[j]); else { k = j - 1; f[j] = ((a[j] - b[j] - f[j]) + 10); f[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; // 式 3 項 v = 25; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを 5 で割る i += 2; v = i; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // f[] + b[] を計算 for (j = 0; j <= MAX-1; j++) z[j] = 0; j = MAX-1; while (j >= 1){ if ((z[j] + f[j] + b[j]) < 10) z[j] = (z[j] + f[j] + b[j]); else { k = j - 1; z[j] = ((z[j] + f[j] + b[j]) - 10); z[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; // ループスタート printf("1番目の2重ループ\n");//ココ while(i <= i_MAX) { printf("\r%d%",i*100/i_MAX);//ココ v = 25; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを i+2 で割る i += 2; v = i; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // z[] - b[] for (j = 0; j <= MAX-1; j++) f[j] = 0; j = MAX-1; while (j >= 1) { if ((z[j] - b[j] - f[j]) >= 0) f[j] = (z[j] - b[j] - f[j]); else { k = j - 1; f[j] = ((z[j] - b[j] - f[j]) + 10); f[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; // 式 3 項 v = 25; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを 5 で割る i += 2; v = i; n = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // f[] + b[] を計算 for (j = 0; j <= MAX-1; j++) z[j] = 0; j = MAX-1; while (j >= 1){ if ((z[j] + f[j] + b[j]) < 10) z[j] = (z[j] + f[j] + b[j]); else { k = j - 1; z[j] = ((z[j] + f[j] + b[j]) - 10); z[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; } for (n=0; n <= MAX-1; n++) x[n] = z[n]; // もういっかい! i = 1; for(s = 2; s <= MAX-1; s++) a[s] = 0; a[0] = 0; a[1] = 4; // 4/239 を計算 v = 239; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; a[n] = syou; n++; } // 4/239*239 をする v = 57121; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを3で割る i += 2; v = i; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // a[] - b[] for (j = 0; j <= MAX-1; j++) f[j] = 0; j = MAX-1; while (j >= 1) { if ((a[j] - b[j] - f[j]) >= 0) f[j] = (a[j] - b[j] - f[j]); else { k = j - 1; f[j] = ((a[j] - b[j] - f[j]) + 10); f[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; // 式 3 項 v = 57121; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを 5 で割る i += 2; v = i; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // f[] + b[] を計算 for (j = 0; j <= MAX-1; j++) z[j] = 0; j = MAX-1; while (j >= 1){ if ((z[j] + f[j] + b[j]) < 10) z[j] = (z[j] + f[j] + b[j]); else { k = j - 1; z[j] = ((z[j] + f[j] + b[j]) - 10); z[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; //ループスタート printf("\n2番目の2重ループ\n");//ココ while(i <= i_MAX) { printf("\r%d%",i*100/i_MAX);//ココ v = 57121; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを i+2 で割る i += 2; v = i; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // z[] - b[] for (j = 0; j <= MAX-1; j++) f[j] = 0; j = MAX-1; while (j >= 1) { if ((z[j] - b[j] - f[j]) >= 0) f[j] = (z[j] - b[j] - f[j]); else { k = j - 1; f[j] = ((z[j] - b[j] - f[j]) + 10); f[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; // 式 3 項 v = 57121; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + a[n]) / v; amari = ((amari * 10) + a[n]) % v; c[n] = syou; n++; } // 上の答えを 5 で割る i += 2; v = i; n = 0; syou = 0; amari = 0; while (n <= MAX-1){ syou = ((amari * 10) + c[n]) / v; amari = ((amari * 10) + c[n]) % v; b[n] = syou; n++; } // f[] + b[] を計算 for (j = 0; j <= MAX-1; j++) z[j] = 0; j = MAX-1; while (j >= 1){ if ((z[j] + f[j] + b[j]) < 10) z[j] = (z[j] + f[j] + b[j]); else { k = j - 1; z[j] = ((z[j] + f[j] + b[j]) - 10); z[k] = 1; } --j; } for (n=0; n <= MAX-1; n++) a[n] = c[n]; } for (n=0; n <= MAX-1; n++) y[n] = f[n]; // 最終解答へ for (j = 0; j <= MAX-1; j++) f[j] = 0; j = MAX-1; while (j >= 1) { if ((x[j] - y[j] - f[j]) >= 0) f[j] = (x[j] - y[j] - f[j]); else { k = j - 1; f[j] = ((x[j] - y[j] - f[j]) + 10); f[k] = 1; } --j; } printf("PI == %d.", f[1]); int state1 = 1; int kilo = 0; i = 0; for (j = 2; j <= 10001; j++, state1++){ printf("%d", f[j]); if (state1 == 50){ printf("\n"); printf("\t"); state1 = 0; ++kilo; if (kilo > 0 && ((kilo % 20) == 0)){ i = (kilo / 20); printf("\n"); printf("\t"); printf("%dK", i); printf("\n"); printf("\n"); printf("\t"); state1 = 0; } else ; } else ; } return 0; }