Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. enum
  6. {
  7. BIN_SIZE = 32,
  8. LONG_SIZE = 8
  9. };
  10.  
  11. int
  12. *get_num(FILE *f)
  13. {
  14. unsigned int n = 8;
  15. unsigned int real_n = 0;
  16. int *buf, *new_buf;
  17. int c = fgetc(f);
  18. buf = NULL;
  19. while(isspace(c)) {
  20. c = fgetc(f);
  21. }
  22. while(c != EOF && !isspace(c)) {
  23. if (!buf || real_n + 1 >= n) {
  24. n <<= 1;
  25. new_buf = realloc(buf, n * sizeof(*buf));
  26. if (!new_buf) {
  27. if (!buf) {
  28. free(buf);
  29. }
  30. return NULL;
  31. }
  32. buf = new_buf;
  33. }
  34. buf[real_n++] = c - '0';
  35. c = fgetc(f);
  36. }
  37. if (buf) {
  38. buf[real_n] = -1;
  39. }
  40. return buf;
  41. }
  42.  
  43. int
  44. get_count(int *num)
  45. {
  46. int n = 0;
  47. while (num[n] != -1) {
  48. n++;
  49. }
  50. return n;
  51. }
  52.  
  53. void
  54. rev(int *s, int n)
  55. {
  56. int c;
  57. for (int i = 0; i < n / 2; i++) {
  58. c = s[i];
  59. s[i] = s[n - i - 1];
  60. s[n - i - 1] = c;
  61. }
  62. }
  63.  
  64. int
  65. mult2_dec(int *num, int n, int *first)
  66. {
  67. int not_null = 0;
  68. int v = 0;
  69. if (*first == n) {
  70. return -1;
  71. }
  72. for (int i = *first; i < n; i++) {
  73. if (num[i] && !not_null) {
  74. not_null = 1;
  75. *first = i;
  76. }
  77. num[i] *= 2;
  78. num[i] += v;
  79. v = num[i] / 10;
  80. num[i] %= 10;
  81. if (i + 1 == n) {
  82. if (not_null) {
  83. return v;
  84. }
  85. *first = n;
  86. return -1;
  87. }
  88. }
  89. return 0;
  90. }
  91.  
  92. int
  93. add1_rev_bin(int *num, int n)
  94. {
  95. num[n - 1]++;
  96. for (int i = n - 1; i >= 0; i--) {
  97. if (num[i] > 1) {
  98. num[i] = 0;
  99. if (!i) {
  100. return 1;
  101. }
  102. num[i - 1]++;
  103. } else {
  104. return 0;
  105. }
  106. }
  107. return 0;
  108. }
  109.  
  110. char
  111. *bin_to_hex(int *ans, int n)
  112. {
  113. char c;
  114. char *hex_ans = calloc(n / 4 + 1, sizeof(*hex_ans));
  115. for (int i = 0; i < n; i += 4) {
  116. c = ans[i] * 8 + ans[i + 1] * 4 + ans[i + 2] * 2 + ans[i + 3] * 1;
  117. c += '0';
  118. if (c > '9') {
  119. c += ('a' - '0' - 10);
  120. }
  121. hex_ans[i / 4] = c;
  122. }
  123. return hex_ans;
  124. }
  125.  
  126. int
  127. *dec_rev_to_bin_32(unsigned long long dec)
  128. {
  129. int *bin_ans = calloc(BIN_SIZE, sizeof(*bin_ans));
  130. for (int i = 0; i < BIN_SIZE; i++) {
  131. bin_ans[BIN_SIZE - i - 1] = dec % 2;
  132. dec /= 2;
  133. }
  134. return bin_ans;
  135. }
  136.  
  137. void
  138. print8(char *ans)
  139. {
  140. int i = 0;
  141. while (ans[i]) {
  142. for (int j = 0; j < 8; j++) {
  143. fputc(ans[i++], stdout);
  144. }
  145. printf(" ");
  146. }
  147. printf("\n");
  148. }
  149.  
  150. unsigned long long
  151. my_pow(int x, int st)
  152. {
  153. unsigned long long ans = 1;
  154. for (int i = 0; i < st; i++) {
  155. ans *= x;
  156. }
  157. return ans;
  158. }
  159.  
  160. int
  161. my_min(int a, int b)
  162. {
  163. return a < b ? a : b;
  164. }
  165.  
  166. unsigned long long
  167. mult2_32(unsigned long long *num, int n)
  168. {
  169. unsigned long long off = 0;
  170. unsigned long long null_mark = -1;
  171. for (int i = 0; i < n; i += LONG_SIZE) {
  172. int k = i / LONG_SIZE;
  173. if (num[k] != 0) {
  174. null_mark = 0;
  175. }
  176. num[k] <<= BIN_SIZE;
  177. num[k] += off;
  178.  
  179. off = num[k] / my_pow(10, my_min(LONG_SIZE, n - i));
  180. num[k] %= my_pow(10, my_min(LONG_SIZE, n - i));
  181. }
  182. if (null_mark) {
  183. return null_mark;
  184. }
  185. return off;
  186. }
  187.  
  188. int
  189. main(void)
  190. {
  191. int prec;
  192. fscanf(stdin, "%d", &prec);
  193. int *num = get_num(stdin);
  194. int n = get_count(num);
  195. rev(num, n);
  196. int c = 0;
  197. int add_count = (BIN_SIZE - prec % BIN_SIZE) % BIN_SIZE;
  198. int *ans = calloc(prec + add_count, sizeof(*ans));
  199. int null_mark = 0;
  200. int last = 0;
  201. int first = 0;
  202.  
  203. unsigned long long *long_num = calloc((n - 1) / LONG_SIZE + 1, sizeof(*long_num));
  204. for (int i = 0; i < n; i += LONG_SIZE) {
  205. for (int j = LONG_SIZE - 1; j >= 0; j--) {
  206. if (i + j < n) {
  207. long_num[i / LONG_SIZE] = long_num[i / LONG_SIZE] * 10 + num[i + j];
  208. }
  209.  
  210. }
  211. }
  212.  
  213. unsigned long long off = 0;
  214.  
  215. for (int i = 0; i < prec / BIN_SIZE; i++) {
  216. if (null_mark) {
  217. break;
  218. }
  219. off = mult2_32(long_num, n);
  220. if (off == -1) {
  221. null_mark = 1;
  222. off = 0;
  223. }
  224. int *bin_ans = dec_rev_to_bin_32(off);
  225. for (int j = 0; j < BIN_SIZE; j++) {
  226. ans[i * BIN_SIZE + j] = bin_ans[j];
  227. }
  228. free(bin_ans);
  229. last = i + 1;
  230. }
  231.  
  232. if (!null_mark) {
  233. for (int i = 0; i < n; i += LONG_SIZE) {
  234. for (int j = 0; j < LONG_SIZE; j++) {
  235. if (i + j < n) {
  236. num[i + j] = long_num[i / LONG_SIZE] % 10;
  237. long_num[i / LONG_SIZE] /= 10;
  238. }
  239. }
  240. }
  241. }
  242.  
  243. for (int i = last * BIN_SIZE; i < prec; i++) {
  244. if (null_mark) {
  245. ans[i] = 0;
  246. } else {
  247. ans[i] = mult2_dec(num, n, &first);
  248. if (ans[i] == -1) {
  249. ans[i] = 0;
  250. null_mark = 1;
  251. }
  252. }
  253. }
  254. if (!null_mark) {
  255. if (mult2_dec(num, n, &first) == 1 && (ans[prec - 1] == 1 || mult2_dec(num, n, &first) != -1)) {
  256. c = add1_rev_bin(ans, prec);
  257. }
  258. if (c) {
  259. printf("1 ");
  260. }
  261. }
  262. prec += add_count;
  263. char *hex_ans = bin_to_hex(ans, prec);
  264. print8(hex_ans);
  265. free(ans);
  266. free(hex_ans);
  267. free(num);
  268. return 0;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement