Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAX_NUM_DIGITS 10000
  5. #define MAX_STR_LEN 1001
  6.  
  7. typedef struct { // +
  8. const int radix;
  9. int num_digits; // number of digits
  10. int digits[MAX_NUM_DIGITS];
  11. // digits[0..num_digits - 1] are the digits of the long integer
  12. // digits[num_digits - 1] != 0
  13. } LongInt;
  14.  
  15. int max(int a, int b) // +
  16. {
  17. if (a>b)
  18. return a;
  19. else
  20. return b;
  21. }
  22. void copy_LongInt (LongInt* a, const LongInt* b)
  23. {
  24. // are the radixes equal ?
  25. if (a->radix != b->radix)
  26. exit(1);
  27.  
  28. a->num_digits = b->num_digits;
  29. int i;
  30. for (i = 0; i < b->num_digits; i++)
  31. a->digits[i] = b->digits[i];
  32. }
  33. void add_LongInt (LongInt* iInp, const LongInt* iAdd)
  34. {
  35. // are the radixes equal ?
  36. if (iInp->radix != iAdd->radix)
  37. exit(1);
  38. if (iAdd->num_digits>iInp->num_digits)
  39. {
  40. iInp->num_digits=iAdd->num_digits;
  41. }
  42. for (int i=0;i<max(iInp->num_digits,iAdd->num_digits); i++)
  43. {
  44. iInp->digits[i]+=iAdd->digits[i];
  45. if((i==max(iInp->num_digits,iAdd->num_digits))&&(iInp->digits[i]/iInp->radix))
  46. iInp->num_digits++;
  47. iInp->digits[i+1]+=(iInp->digits[i]/(iInp->radix));
  48. iInp->digits[i]%=(iInp->radix);
  49. }
  50. }
  51.  
  52. void multiply_LongInt_int (LongInt* iInp, int c)
  53. {
  54. if (c == 0) {
  55. init_LongInt(iInp, 0);
  56. return;
  57. }
  58. for (int i=0;i<iInp->num_digits; i++)
  59. {
  60. iInp->digits[i]*=c;
  61. }
  62. for (int i=0;i<iInp->num_digits; i++)
  63. {
  64. iInp->digits[i+1]=iInp->digits[i]/iInp->radix;
  65. iInp->digits[i]%=iInp->radix;
  66. }
  67. int i=0;
  68. while (iInp->digits[i]!=0)
  69. {
  70. iInp->digits[i+1]=iInp->digits[i]/iInp->radix;
  71. iInp->digits[i]%=iInp->radix;
  72. }
  73.  
  74. }
  75. void init_LongInt (LongInt* a, int val)
  76. {
  77. int m = a->radix;
  78.  
  79. // is the radix positive ?
  80. if (m <= 0)
  81. exit(1);
  82.  
  83. if (val == 0) {
  84. a->num_digits = 1;
  85. a->digits[0] = 0;
  86. return;
  87. }
  88.  
  89. int i = 0;
  90. int b = val;
  91. while (b > 0) {
  92. a->digits[i++] = b % m;
  93. b = b / m;
  94. }
  95. a->num_digits = i;
  96. }
  97. int ch2digit (char c) // +
  98. {
  99. if (c >= '0' && c <= '9')
  100. return c - '0';
  101. else if (c >= 'A' && c <= 'Z')
  102. return c - 'A' + 10;
  103. else
  104. return -1;
  105. }
  106. char digit2ch (int d) // +
  107. {
  108. if (d >= 0 && d <= 9)
  109. return '0' + d;
  110. else if (d >= 10 && d <= 35)
  111. return 'A' + d - 10;
  112. }
  113. void Read_LongInt(FILE *fin, LongInt *a) // +
  114. {
  115. int i=0;
  116. char buf [MAX_STR_LEN];
  117. fgets(buf, MAX_STR_LEN, fin);
  118.  
  119. int len=strlen(buf);
  120. for (i=len-2;i>=0;i--)
  121. {
  122. a->digits[i] = ch2digit(buf[i]);
  123. }
  124. a->num_digits=len-1;
  125. }
  126. void Print_LongInt(FILE *fout, LongInt a) // +
  127. {
  128. for (int i=a.num_digits-1; i>=0; i--)
  129. {
  130. fprintf(fout,"%c",digit2ch(a.digits[i]));
  131. }
  132. fprintf(fout,"\n");
  133. }
  134. void convert (const LongInt* a, LongInt* x)
  135. {
  136. int p = a->radix;
  137. int q = x->radix;
  138. int k = a->num_digits - 1;
  139.  
  140. LongInt y = { q };
  141. init_LongInt(x, a->digits[0]);
  142. init_LongInt(&y, 1);
  143.  
  144. LongInt z = { q };
  145. int i;
  146. for (i = 1; i <= k; i++) {
  147. // y = p^{i-1}, x = a[0] + a[1]*p + a[2]*p^2 + ... + a[i-1]*p^{i-1}
  148. multiply_LongInt_int(&y, p);
  149. copy_LongInt(&z, &y);
  150. multiply_LongInt_int(&z, a->digits[i]);
  151. add_LongInt(x, &z);
  152. // y = p^i, x = a[0] + a[1]*p + a[2]*p^2 + ... + a[i]*p^i
  153. }
  154. }
  155. int main()
  156. {
  157. FILE *fin = fopen ("input.txt", "r");
  158. FILE *fout = fopen ("output.txt", "w");
  159. LongInt a, b;
  160. int radix1,radix2;
  161. fscanf(fin, "%d%d\n", &a.radix, &b.radix);
  162. Read_LongInt(fin, &a);
  163. Read_LongInt(fin, &b);
  164. add_LongInt(&a,&b);
  165. //convert(&a,&a);
  166. Print_LongInt(fout, b);
  167. fclose(fin);
  168. fclose(fout);
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement