fork download
  1. /* author: Leonardone @ NEETSDKASU */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. typedef unsigned long ulong;
  8.  
  9. #define UL(v) ((ulong)(v))
  10.  
  11. typedef struct _BigNum {
  12. int dot;
  13. int size;
  14. char value[1];
  15. } BigNum, *LPBigNum;
  16.  
  17. int digits(ulong value);
  18. LPBigNum newBigNum(ulong value);
  19. LPBigNum newBigNumDbl(double value);
  20. LPBigNum newBigNumStr(const char *str);
  21. void printBigNum(const BigNum *num);
  22.  
  23. int main(void) {
  24. LPBigNum num = NULL;
  25.  
  26. num = newBigNum(UL(1234567890));
  27. printBigNum(num);
  28. putchar('\n');
  29. if (num != NULL) {
  30. free(num);
  31. }
  32.  
  33. num = newBigNum(UL(0));
  34. printBigNum(num);
  35. putchar('\n');
  36. if (num != NULL) {
  37. free(num);
  38. }
  39.  
  40. num = newBigNumStr("98765.4321");
  41. printBigNum(num);
  42. putchar('\n');
  43. if (num != NULL) {
  44. free(num);
  45. }
  46.  
  47. num = newBigNumDbl(4.0 * atan(1.0));
  48. printBigNum(num);
  49. putchar('\n');
  50. if (num != NULL) {
  51. free(num);
  52. }
  53.  
  54. return 0;
  55. }
  56.  
  57. int digits(ulong value) {
  58. int c = 0;
  59. while (value > 0UL) {
  60. value /= 10UL;
  61. c++;
  62. }
  63. return c;
  64. }
  65.  
  66. LPBigNum newBigNum(ulong value) {
  67. int size = digits(value);
  68. LPBigNum temp = (LPBigNum)malloc(sizeof(BigNum) + size);
  69. if (temp != NULL) {
  70. temp->size = size;
  71. temp->dot = size;
  72. while (value > 0UL) {
  73. size--;
  74. temp->value[size] = (char)(value % 10UL);
  75. value /= 10UL;
  76. }
  77. }
  78. return temp;
  79. }
  80.  
  81. LPBigNum newBigNumStr(const char *str) {
  82. LPBigNum temp;
  83. int len, size, dot, i, j;
  84. const char *c;
  85. if (str == NULL) {
  86. return NULL;
  87. }
  88. len = strlen(str);
  89. c = str;
  90. size = 0;
  91. dot = -1;
  92. for (i = 0; i < len; i++) {
  93. if (*c == '0') {
  94. if (size > 0) {
  95. size++;
  96. }
  97. } else if (*c >= '1' && *c <= '9') {
  98. size++;
  99. } else if (*c == '.' && dot < 0) {
  100. dot = size;
  101. } else {
  102. return NULL;
  103. }
  104. c++;
  105. }
  106. if (dot < 0) {
  107. dot = size;
  108. }
  109. temp = (LPBigNum)malloc(sizeof(BigNum) + size);
  110. if (temp != NULL) {
  111. temp->size = size;
  112. temp->dot = dot;
  113. c = str;
  114. j = 0;
  115. for (i = 0; i < len; i++) {
  116. if (*c == '0') {
  117. if (j > 0) {
  118. temp->value[j] = 0;
  119. j++;
  120. }
  121. } else if (*c >= '1' && *c <= '9') {
  122. temp->value[j] = *c - '0';
  123. j++;
  124. }
  125. c++;
  126. }
  127. }
  128. return temp;
  129. }
  130.  
  131. LPBigNum newBigNumDbl(double value) {
  132. char buf[100];
  133. sprintf(buf, "%35.34lf", value);
  134. return newBigNumStr(buf);
  135. }
  136.  
  137. void printBigNum(const BigNum *num) {
  138. int i;
  139. if (num == NULL) {
  140. printf("null");
  141. } else {
  142. for (i = 0; i < num->size; i++) {
  143. if (i == num->dot) {
  144. putchar('0');
  145. break;
  146. }
  147. if (num->value[i] != 0) {
  148. break;
  149. }
  150. }
  151. if (i < num->size) {
  152. for (; i < num->size; i++) {
  153. if (i == num->dot) {
  154. putchar('.');
  155. }
  156. putchar('0' + num->value[i]);
  157. }
  158. } else {
  159. putchar('0');
  160. }
  161. }
  162. }
  163.  
Success #stdin #stdout 0s 2140KB
stdin
Standard input is empty
stdout
1234567890
0
98765.4321
3.1415926535897931159979634685441852