Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include <conio.h>
  5. #include <locale.h>
  6. #pragma warning(disable : 4996)
  7. #define MAX_LEN 25500
  8. #define MAX_LEN_CALC 25500
  9.  
  10. bool compare(int ch2[], int ch1[], int len)
  11. {
  12. for (int i = 0; i < len; i++) if (ch1[i] < ch2[i]) return 1;
  13. else if (ch1[i] > ch2[i]) return 0;
  14. return 1;
  15. }
  16.  
  17. int max(int a, int b)
  18. {
  19. if (a > b) return a;
  20. else return b;
  21. }
  22.  
  23. int min(int a, int b)
  24. {
  25. if (a < b) return a;
  26. else return b;
  27. }
  28.  
  29. void shiftR(int number[], int& len)
  30. {
  31. for (int i = len - 1; i >= 0; i--)
  32. {
  33. number[i + 1] = number[i];
  34. }
  35. number[0] = 0;
  36. len++;
  37. }
  38.  
  39. void shiftL(int number[], int& len)
  40. {
  41. for (int i = 0; i <= len - 1; i++)
  42. {
  43. number[i] = number[i + 1];
  44. }
  45. number[len] = 0;
  46. len--;
  47. }
  48.  
  49. void fromArrayToStr(int mas[], char str[], int& len)
  50. {
  51. for (int i = 0; i < len; i++) str[i] = (char)(mas[i] + 48);
  52. str[len] = '\0';
  53. }
  54.  
  55. void sum(int ch1[], int ch2[], int& len, int rez[])
  56. {
  57. for (int i = len - 1; i >= 0; i--)
  58. {
  59. rez[i] = (rez[i + 1] + ch1[i] + ch2[i]) / 10;
  60. rez[i + 1] = (rez[i + 1] + ch1[i] + ch2[i]) % 10;
  61. }
  62.  
  63. if (rez[0] == 0) shiftL(rez, len);
  64. len++;
  65. }
  66.  
  67. void razn(int ch1[], int ch2[], int& len, int rez[], bool sdvig)
  68. {
  69. for (int i = len - 1; i >= 0; i--)
  70. {
  71. rez[i] = rez[i] + ch1[i] - ch2[i];
  72. if (rez[i] < 0)
  73. {
  74. rez[i] += 10;
  75. rez[i - 1]--;
  76. }
  77. }
  78.  
  79. while ((rez[0] == 0) && (len > 1) && (sdvig)) shiftL(rez, len);
  80. }
  81.  
  82. void proizv(int ch1[], int ch2[], int& len, int rez[])
  83. {
  84. int i, j;
  85. for (i = len - 1; i >= 0; i--)
  86. {
  87. for (j = len - 1; j >= 0; j--)
  88. {
  89. rez[i + j] = rez[i + j] + (rez[i + j + 1] + ch1[i] * ch2[j]) / 10;
  90. rez[i + j + 1] = (rez[i + j + 1] + ch1[i] * ch2[j]) % 10;
  91. }
  92. }
  93. len *= 2;
  94. while ((rez[0] == 0) && (len > 1)) shiftL(rez, len);
  95. }
  96.  
  97. void chastnoe(int ch1[], int ch2[], int& len1, int& len2, int rez[])
  98. {
  99. int sdvig = len1 - len2, rezraz[MAX_LEN_CALC] = { 0 }, lendel(0);
  100. for (int i = 0; i <= sdvig; i++)
  101. {
  102. while (compare(ch1, ch2, len1))
  103. {
  104. razn(ch1, ch2, len1, rezraz, 0);
  105. rez[i]++;
  106. for (int j = 0; j < len1; j++)
  107. {
  108. ch1[j] = rezraz[j];
  109. rezraz[j] = 0;
  110. }
  111. }
  112. lendel++;
  113. shiftR(ch2, len1);
  114. len1--;
  115. }
  116. len1 = lendel;
  117. }
  118.  
  119. void calc(char ch1[], char ch2[], char deistvie, char rezch[], int& len1)
  120. {
  121. int len2, sdvig, chihlo1[MAX_LEN_CALC] = { 0 }, chihlo2[MAX_LEN_CALC] = { 0 }, rezmas[MAX_LEN_CALC] = { 0 };
  122.  
  123. len1 = strlen(ch1);
  124. len2 = strlen(ch2);
  125. sdvig = abs(len1 - len2);
  126.  
  127. for (int i = 0; i < len1; i++) chihlo1[i] = (int)ch1[i] - 48;
  128. for (int i = 0; i < len2; i++) chihlo2[i] = (int)ch2[i] - 48;
  129.  
  130. if ((len1 >= len2) && (deistvie != '/')) for (int i = 0; i < sdvig; i++) shiftR(chihlo2, len2);
  131. else if (deistvie != '/') for (int i = 0; i < sdvig; i++) shiftR(chihlo1, len1);
  132.  
  133. switch (deistvie)
  134. {
  135. case '+': sum(chihlo1, chihlo2, len1, rezmas); break;
  136. case '-': razn(chihlo1, chihlo2, len1, rezmas, 1); break;
  137. case '*': proizv(chihlo1, chihlo2, len1, rezmas); break;
  138. case '/': chastnoe(chihlo1, chihlo2, len1, len2, rezmas); break;
  139. }
  140. fromArrayToStr(rezmas, rezch, len1);
  141. }
  142.  
  143. void outputKNumbers(int k, char base[])
  144. {
  145. char number[MAX_LEN_CALC * 2] = { '1' }, rezStr[MAX_LEN] = { '\0' }, rezNumber[MAX_LEN_CALC * 2];
  146. int len, amountDigit(1);
  147. for (int i = 0; i < MAX_LEN_CALC * 2 - 1; i++)
  148. rezNumber[i] = '0';
  149. rezNumber[MAX_LEN_CALC * 2 - 1] = '\0';
  150.  
  151.  
  152. while (k >= amountDigit)
  153. {
  154. k -= amountDigit;
  155. strcat(rezStr, number);
  156. calc(number, base, '*', rezNumber, len);
  157. strcpy(number, rezNumber);
  158. for (int i = 0; i < len; i++)
  159. rezNumber[i] = '0';
  160. rezNumber[len] = '\0';
  161. amountDigit = strlen(number);
  162. }
  163. number[k] = '\0';
  164. strcat(rezStr, number);
  165. printf("%s\n", rezStr);
  166. }
  167.  
  168. int main()
  169. {
  170. int k;
  171. char base[MAX_LEN];
  172. setlocale(LC_ALL, "ru");
  173.  
  174. printf("Введите количество цифр последовательности:");
  175. scanf_s("%d", &k);
  176. printf("Введите основание:");
  177. scanf("%s", base);
  178.  
  179. outputKNumbers(k, base);
  180. _getch();
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement