fork download
  1. #include <stdio.h>
  2.  
  3. #define LEN 100
  4.  
  5. void sum(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length);
  6. void sub(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length);
  7. int compare(int *buff1, int len1, int *buff2, int len2);
  8.  
  9. int main() {
  10. int num1[LEN], num2[LEN];
  11. int len1 = 0, len2 = 0;
  12. int result_sum[LEN + 1], result_sub[LEN];
  13. int result_length_sum, result_length_sub;
  14.  
  15. // Чтение первого числа
  16. while (len1 < LEN && scanf("%d", &num1[len1]) == 1 && num1[len1] >= 0 && num1[len1] <= 9) {
  17. len1++;
  18. }
  19.  
  20. // Чтение второго числа
  21. while (len2 < LEN && scanf("%d", &num2[len2]) == 1 && num2[len2] >= 0 && num2[len2] <= 9) {
  22. len2++;
  23. }
  24.  
  25. // Выполнение сложения
  26. sum(num1, len1, num2, len2, result_sum, &result_length_sum);
  27.  
  28. // Выполнение вычитания
  29. if (compare(num1, len1, num2, len2) >= 0) {
  30. sub(num1, len1, num2, len2, result_sub, &result_length_sub);
  31. } else {
  32. printf("n/a\\n");
  33. return 0;
  34. }
  35.  
  36. // Вывод результата сложения
  37. for (int i = 0; i < result_length_sum; ++i) {
  38. printf("%d ", result_sum[i]);
  39. }
  40. printf("\\n");
  41.  
  42. // Вывод результата вычитания
  43. for (int i = 0; i < result_length_sub; ++i) {
  44. printf("%d ", result_sub[i]);
  45. }
  46. printf("\\n");
  47.  
  48. return 0;
  49. }
  50.  
  51. void sum(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length) {
  52. int carry = 0, i;
  53. int max_len = len1 > len2 ? len1 : len2;
  54.  
  55. for (i = 0; i < max_len; i++) {
  56. int digit1 = (i < len1) ? buff1[len1 - 1 - i] : 0;
  57. int digit2 = (i < len2) ? buff2[len2 - 1 - i] : 0;
  58. int total = digit1 + digit2 + carry;
  59. result[max_len - i] = total % 10; // Записываем последнюю цифру
  60. carry = total / 10; // Остаток становится переносом
  61. }
  62. if (carry > 0) {
  63. result[0] = carry; // Если остался перенос, записываем его
  64. *result_length = max_len + 1;
  65. } else {
  66. for (i = 0; i < max_len; i++) {
  67. result[i] = result[i + 1]; // Сдвигаем массив
  68. }
  69. *result_length = max_len;
  70. }
  71. }
  72.  
  73. void sub(int *buff1, int len1, int *buff2, int len2, int *result, int *result_length) {
  74. int borrow = 0, i;
  75.  
  76. for (i = 0; i < len1; i++) {
  77. int digit1 = buff1[len1 - 1 - i];
  78. int digit2 = (i < len2) ? buff2[len2 - 1 - i] : 0;
  79.  
  80. if (digit1 < digit2 + borrow) {
  81. digit1 += 10;
  82. borrow = 1;
  83. } else {
  84. borrow = 0;
  85. }
  86. result[len1 - 1 - i] = digit1 - digit2 - borrow;
  87. }
  88.  
  89. // Удаление ведущих нулей
  90. *result_length = len1;
  91. while (*result_length > 1 && result[len1 - *result_length] == 0) {
  92. (*result_length)--;
  93. }
  94. }
  95.  
  96. int compare(int *buff1, int len1, int *buff2, int len2) {
  97. if (len1 != len2) {
  98. return len1 - len2; // Сравниваем длины
  99. }
  100. for (int i = 0; i < len1; i++) {
  101. if (buff1[i] != buff2[i]) {
  102. return buff1[i] - buff2[i]; // Сравниваем элементы
  103. }
  104. }
  105. return 0; // Числа равны
  106. }
Success #stdin #stdout 0s 5284KB
stdin
1944674407370955161
29
stdout
\n\n