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