Guest User

a+b=c

a guest
Nov 26th, 2019
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. int rec(char *s, int ind, int carry, int sz_a, int a2, int sz_b, int b2, int sz_c, int c2) {
  7.     //printf("%d %s\n", ind, s);
  8.     if (ind >= sz_c)
  9.         return 1;
  10.     if (ind >= sz_a && ind >= sz_b) {
  11.         if (isdigit(carry + '0')) {
  12.             s[c2 - ind] = carry + '0';
  13.             int cur = rec(s, ind + 1, 0, sz_a, a2, sz_b, b2, sz_c, c2);
  14.             if (cur)
  15.                 return 1;
  16.         }
  17.         return 0;
  18.     }
  19.     if (ind >= sz_a) {
  20.         int b = s[b2 - ind];
  21.         int c = s[c2 - ind];
  22.         if (b != '?' && c != '?') {
  23.             int b0 = b - '0';
  24.             int c0 = c - '0';
  25.             if ((carry + b0) % 10 != c0)
  26.                 return 0;
  27.  
  28.             return rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  29.         }
  30.         if (b != '?') {
  31.             int b0 = b - '0';
  32.             int c0 = (b0 + carry) % 10;
  33.  
  34.             s[c2 - ind] = c0 + '0';
  35.             return rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  36.         }
  37.         if (c != '?') {
  38.             int c0 = c - '0';
  39.             int b0 = c0 - carry;
  40.             int b1 = (10 + c0) - carry;
  41.             if (isdigit(b0 + '0')) {
  42.                 s[b2 - ind] = b0 + '0';
  43.                 int cur = rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  44.                 if (cur)
  45.                     return 1;
  46.             }
  47.             if (isdigit(b1 + '0')) {
  48.                 s[b2 - ind] = b1 + '0';
  49.                 int cur = rec(s, ind + 1, (b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  50.                 if (cur)
  51.                     return 1;
  52.             }
  53.             return 0;
  54.         }
  55.         for (int b0 = 0; b0 <= 9; ++b0) {
  56.             int c0 = (b0 + carry) % 10;
  57.             if (isdigit(c0 + '0')) {
  58.                 s[c2 - ind] = c0 + '0';
  59.                 int cur = rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  60.                 if (cur)
  61.                     return 1;
  62.             }
  63.         }
  64.         return 0;
  65.     }
  66.     if (ind >= sz_b) {
  67.         int a = s[a2 - ind];
  68.         int c = s[c2 - ind];
  69.  
  70.         if (a != '?' && c != '?') {
  71.             int a0 = a - '0';
  72.             int c0 = c - '0';
  73.             if ((a0 + carry) % 10 != c0)
  74.                 return 0;
  75.             return rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  76.         }
  77.         if (c != '?') {
  78.             int c0 = c - '0';
  79.             int a0 = c0 - carry;
  80.             int a1 = (c0 + 10) - carry;
  81.  
  82.             if (isdigit(a0 + '0')) {
  83.                 s[a2 - ind] = a0 + '0';
  84.                 int cur = rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  85.                 if (cur)
  86.                     return 1;
  87.             }
  88.             if (isdigit(a1 + '0')) {
  89.                 s[a2 - ind] = a1 + '0';
  90.                 int cur = rec(s, ind + 1, (a1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  91.                 if (cur)
  92.                     return 1;
  93.             }
  94.             return 0;
  95.         }
  96.         if (a != '?') {
  97.             int a0 = a - '0';
  98.             int c0 = (a0 + carry) % 10;
  99.             if (!isdigit(c0 + '0'))
  100.                 return 0;
  101.             s[c2 - ind] = c0 + '0';
  102.             return rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  103.         }
  104.         for (int a0 = 0; a0 <= 9; ++a0) {
  105.             int c0 = (a0 + carry) % 10;
  106.             if (isdigit(c0 + '0')) {
  107.                 s[c2 - ind] = c0;
  108.                 s[a2 - ind] = a0;
  109.                 int cur = rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  110.                 if (cur)
  111.                     return 1;
  112.             }
  113.         }
  114.         return 0;
  115.     }
  116.     char a = s[a2 - ind];
  117.     char b = s[b2 - ind];
  118.     char c = s[c2 - ind];
  119.  
  120.     if (a != '?' && b != '?' && c != '?') {
  121.         int a0 = a - '0';
  122.         int b0 = b - '0';
  123.         int c0 = c - '0';
  124.         if ((a0 + b0 + carry) % 10 != c0)
  125.             return 0;
  126.         return rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  127.     }
  128.     if (a != '?' && b != '?') {
  129.         int a0 = a - '0';
  130.         int b0 = b - '0';
  131.         int c0 = a0 + b0 + carry;
  132.         if (!isdigit(c0 + '0'))
  133.             return 0;
  134.         s[c2 - ind] = c0 + '0';
  135.         return rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  136.     }
  137.     if (a != '?' && c != '?') {
  138.         int a0 = a - '0';
  139.         int c0 = c - '0';
  140.  
  141.         int b0 = c0 - (a0 + carry);
  142.         int b1 = (10 + c0) - (a0 + carry);
  143.  
  144.         if (isdigit(b0 + '0')) {
  145.             s[b2 - ind] = b0 + '0';
  146.             int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  147.             if (cur)
  148.                 return 1;
  149.         }
  150.         if (isdigit(b1 + '0')) {
  151.             s[b2 - ind] = b1 + '0';
  152.             int cur = rec(s, ind + 1, (a0 + b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  153.             if (cur)
  154.                 return 1;
  155.         }
  156.         return 0;
  157.     }
  158.     if (b != '?' && c != '?') {
  159.         int b0 = b - '0';
  160.         int c0 = c - '0';
  161.  
  162.         int a0 = c0 - (b0 + carry);
  163.         int a1 = (10 + c0) - (b0 + carry);
  164.  
  165.         if (isdigit(a0 + '0')) {
  166.             s[a2 - ind] = a0 + '0';
  167.             int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  168.             if (cur)
  169.                 return 1;
  170.         }
  171.         if (isdigit(a1 + '0')) {
  172.             s[a2 - ind] = a1 + '0';
  173.             int cur = rec(s, ind + 1, (a1 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  174.             if (cur)
  175.                 return 1;
  176.         }
  177.         return 0;
  178.     }
  179.     if (c != '?') {
  180.         int c0 = c - '0';
  181.  
  182.         for (int a0 = 0; a0 <= 9; ++a0) {
  183.             int b0 = c0 - (a0 + carry);
  184.             int b1 = (10 + c0) - (a0 + carry);
  185.  
  186.             if (isdigit(b0 + '0')) {
  187.                 s[a2 - ind] = a0 + '0';
  188.                 s[b2 - ind] = b0 + '0';
  189.  
  190.                 int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  191.                 if (cur)
  192.                     return 1;
  193.             }
  194.             if (isdigit(b1 + '0')) {
  195.                 s[a2 - ind] = a0 + '0';
  196.                 s[b2 - ind] = b1 + '0';
  197.  
  198.                 int cur = rec(s, ind + 1, (a0 + b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  199.                 if (cur)
  200.                     return 1;
  201.             }
  202.         }
  203.         return 0;
  204.     }
  205.     if (a != '?') {
  206.         int a0 = a - '0';
  207.  
  208.         for (int b0 = 0; b0 <= 9; ++b0) {
  209.             int c0 = (a0 + b0 + carry) % 10;
  210.  
  211.             if (isdigit(c0 + '0')) {
  212.                 s[b2 - ind] = b0 + '0';
  213.                 s[c2 - ind] = c0 + '0';
  214.  
  215.                 int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  216.                 if (cur)
  217.                     return 1;
  218.             }
  219.         }
  220.         return 0;
  221.     }
  222.     if (b != '?') {
  223.         int b0 = b - '0';
  224.  
  225.         for (int a0 = 0; a0 <= 9; ++a0) {
  226.             int c0 = (a0 + b0 + carry) % 10;
  227.  
  228.             if (isdigit(c0 + '0')) {
  229.                 s[a2 - ind] = a0 + '0';
  230.                 s[c2 - ind] = c0 + '0';
  231.  
  232.                 int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  233.                 if (cur)
  234.                     return 1;
  235.             }
  236.         }
  237.         return 0;
  238.     }
  239.     for (int a0 = 0; a0 <= 9; ++a0) {
  240.         for (int b0 = a0; b0 <= 9; ++b0) {
  241.             int c0 = (a0 + b0 + carry) % 10;
  242.             if (isdigit(c0 + '0')) {
  243.                 s[a2 - ind] = a0 + '0';
  244.                 s[b2 - ind] = b0 + '0';
  245.                 s[c2 - ind] = c0 + '0';
  246.  
  247.                 int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
  248.                 if (cur)
  249.                     return 1;
  250.             }
  251.         }
  252.     }
  253.     return 0;
  254. }
  255.  
  256. int main(void) {
  257.     char s[205];
  258.     scanf("%s", s);
  259.  
  260.     int a1, a2, b1, b2, c1, c2;
  261.     int i = 0;
  262.  
  263.     a1 = i;
  264.     while (s[i] != '+') {
  265.         ++i;
  266.     }
  267.     a2 = i - 1;
  268.     ++i;
  269.     b1 = i;
  270.     while (s[i] != '=') {
  271.         ++i;
  272.     }
  273.     b2 = i - 1;
  274.     ++i;
  275.     c1 = i;
  276.     while (s[i] && s[i] != '\n') {
  277.         ++i;
  278.     }
  279.     c2 = i - 1;
  280.  
  281.     int sz_a = a2 - a1 + 1;
  282.     int sz_b = b2 - b1 + 1;
  283.     int sz_c = c2 - c1 + 1;
  284.  
  285.     if (rec(s, 0, 0, sz_a, a2, sz_b, b2, sz_c, c2)) {
  286.         i = 0;
  287.         while (s[i] && s[i] != '\n') {
  288.             if (s[i] == '?')
  289.                 s[i] = '0';
  290.             ++i;
  291.         }
  292.         printf("%s", s);
  293.     }
  294.     else {
  295.         printf("No");
  296.     }
  297.  
  298.     return 0;
  299. }
Advertisement
Add Comment
Please, Sign In to add comment