2
0

pi.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. void ComputePi(int numdigits, char* pi)
  4. {
  5. int alength = 10 * numdigits / 3;
  6. int* a = (int*) malloc(alength * sizeof(int));
  7. int piLength = 0;
  8. int nines = 0;
  9. int predigit = 0;
  10. int i, j;
  11. for(i = 0; i < alength; ++i)
  12. a[i] = 2;
  13. for (j = 0; j < numdigits; ++j)
  14. {
  15. int q = 0;
  16. int p = 2 * alength - 1;
  17. for (i = alength; --i >= 0; )
  18. {
  19. int x = 10*a[i] + q*(i+1);
  20. a[i] = x % p;
  21. q = x / p;
  22. p -= 2;
  23. }
  24. a[0] = q % 10;
  25. q /= 10;
  26. if (q == 9)
  27. ++nines;
  28. else if (q == 10)
  29. {
  30. int k;
  31. pi[piLength] = (char) (predigit + 1 + '0');
  32. for (k = 1; k <= nines; ++k)
  33. pi[piLength+k] = '0';
  34. piLength += nines + 1;
  35. predigit = 0;
  36. nines = 0;
  37. }
  38. else
  39. {
  40. int k;
  41. pi[piLength] = (char)(predigit + '0');
  42. predigit = q;
  43. for (k = 1; k <= nines; ++k)
  44. pi[piLength + k] = '9';
  45. piLength += nines + 1;
  46. nines = 0;
  47. }
  48. }
  49. pi[piLength] = (char)(predigit + '0');
  50. pi[piLength+1] = '\0';
  51. free(a);
  52. }
  53. int main(int argc, char** argv)
  54. {
  55. int numdigits;
  56. char* pi;
  57. if (argc <= 1)
  58. {
  59. fprintf(stderr, "usage: pi #DIGITS [FILE]");
  60. return 1;
  61. }
  62. numdigits = atoi(argv[1]);
  63. pi = (char*) malloc(numdigits+1);
  64. ComputePi(numdigits, pi);
  65. if (argc > 2)
  66. {
  67. FILE* fp = fopen(argv[2], "w");
  68. if (fp == NULL)
  69. {
  70. fprintf(stderr, "Cannot open %s\n", argv[2]);
  71. return 2;
  72. }
  73. fputs(pi, fp);
  74. fputc('\n', fp);
  75. fclose(fp);
  76. }
  77. else
  78. puts(pi);
  79. free(pi);
  80. return 0;
  81. }