Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- int rec(char *s, int ind, int carry, int sz_a, int a2, int sz_b, int b2, int sz_c, int c2) {
- //printf("%d %s\n", ind, s);
- if (ind >= sz_c)
- return 1;
- if (ind >= sz_a && ind >= sz_b) {
- if (isdigit(carry + '0')) {
- s[c2 - ind] = carry + '0';
- int cur = rec(s, ind + 1, 0, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- return 0;
- }
- if (ind >= sz_a) {
- int b = s[b2 - ind];
- int c = s[c2 - ind];
- if (b != '?' && c != '?') {
- int b0 = b - '0';
- int c0 = c - '0';
- if ((carry + b0) % 10 != c0)
- return 0;
- return rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- if (b != '?') {
- int b0 = b - '0';
- int c0 = (b0 + carry) % 10;
- s[c2 - ind] = c0 + '0';
- return rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- if (c != '?') {
- int c0 = c - '0';
- int b0 = c0 - carry;
- int b1 = (10 + c0) - carry;
- if (isdigit(b0 + '0')) {
- s[b2 - ind] = b0 + '0';
- int cur = rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- if (isdigit(b1 + '0')) {
- s[b2 - ind] = b1 + '0';
- int cur = rec(s, ind + 1, (b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- return 0;
- }
- for (int b0 = 0; b0 <= 9; ++b0) {
- int c0 = (b0 + carry) % 10;
- if (isdigit(c0 + '0')) {
- s[c2 - ind] = c0 + '0';
- int cur = rec(s, ind + 1, (b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- return 0;
- }
- if (ind >= sz_b) {
- int a = s[a2 - ind];
- int c = s[c2 - ind];
- if (a != '?' && c != '?') {
- int a0 = a - '0';
- int c0 = c - '0';
- if ((a0 + carry) % 10 != c0)
- return 0;
- return rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- if (c != '?') {
- int c0 = c - '0';
- int a0 = c0 - carry;
- int a1 = (c0 + 10) - carry;
- if (isdigit(a0 + '0')) {
- s[a2 - ind] = a0 + '0';
- int cur = rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- if (isdigit(a1 + '0')) {
- s[a2 - ind] = a1 + '0';
- int cur = rec(s, ind + 1, (a1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- return 0;
- }
- if (a != '?') {
- int a0 = a - '0';
- int c0 = (a0 + carry) % 10;
- if (!isdigit(c0 + '0'))
- return 0;
- s[c2 - ind] = c0 + '0';
- return rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- for (int a0 = 0; a0 <= 9; ++a0) {
- int c0 = (a0 + carry) % 10;
- if (isdigit(c0 + '0')) {
- s[c2 - ind] = c0;
- s[a2 - ind] = a0;
- int cur = rec(s, ind + 1, (a0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- return 0;
- }
- char a = s[a2 - ind];
- char b = s[b2 - ind];
- char c = s[c2 - ind];
- if (a != '?' && b != '?' && c != '?') {
- int a0 = a - '0';
- int b0 = b - '0';
- int c0 = c - '0';
- if ((a0 + b0 + carry) % 10 != c0)
- return 0;
- return rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- if (a != '?' && b != '?') {
- int a0 = a - '0';
- int b0 = b - '0';
- int c0 = a0 + b0 + carry;
- if (!isdigit(c0 + '0'))
- return 0;
- s[c2 - ind] = c0 + '0';
- return rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- }
- if (a != '?' && c != '?') {
- int a0 = a - '0';
- int c0 = c - '0';
- int b0 = c0 - (a0 + carry);
- int b1 = (10 + c0) - (a0 + carry);
- if (isdigit(b0 + '0')) {
- s[b2 - ind] = b0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- if (isdigit(b1 + '0')) {
- s[b2 - ind] = b1 + '0';
- int cur = rec(s, ind + 1, (a0 + b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- return 0;
- }
- if (b != '?' && c != '?') {
- int b0 = b - '0';
- int c0 = c - '0';
- int a0 = c0 - (b0 + carry);
- int a1 = (10 + c0) - (b0 + carry);
- if (isdigit(a0 + '0')) {
- s[a2 - ind] = a0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- if (isdigit(a1 + '0')) {
- s[a2 - ind] = a1 + '0';
- int cur = rec(s, ind + 1, (a1 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- return 0;
- }
- if (c != '?') {
- int c0 = c - '0';
- for (int a0 = 0; a0 <= 9; ++a0) {
- int b0 = c0 - (a0 + carry);
- int b1 = (10 + c0) - (a0 + carry);
- if (isdigit(b0 + '0')) {
- s[a2 - ind] = a0 + '0';
- s[b2 - ind] = b0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- if (isdigit(b1 + '0')) {
- s[a2 - ind] = a0 + '0';
- s[b2 - ind] = b1 + '0';
- int cur = rec(s, ind + 1, (a0 + b1 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- return 0;
- }
- if (a != '?') {
- int a0 = a - '0';
- for (int b0 = 0; b0 <= 9; ++b0) {
- int c0 = (a0 + b0 + carry) % 10;
- if (isdigit(c0 + '0')) {
- s[b2 - ind] = b0 + '0';
- s[c2 - ind] = c0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- return 0;
- }
- if (b != '?') {
- int b0 = b - '0';
- for (int a0 = 0; a0 <= 9; ++a0) {
- int c0 = (a0 + b0 + carry) % 10;
- if (isdigit(c0 + '0')) {
- s[a2 - ind] = a0 + '0';
- s[c2 - ind] = c0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- return 0;
- }
- for (int a0 = 0; a0 <= 9; ++a0) {
- for (int b0 = a0; b0 <= 9; ++b0) {
- int c0 = (a0 + b0 + carry) % 10;
- if (isdigit(c0 + '0')) {
- s[a2 - ind] = a0 + '0';
- s[b2 - ind] = b0 + '0';
- s[c2 - ind] = c0 + '0';
- int cur = rec(s, ind + 1, (a0 + b0 + carry) / 10, sz_a, a2, sz_b, b2, sz_c, c2);
- if (cur)
- return 1;
- }
- }
- }
- return 0;
- }
- int main(void) {
- char s[205];
- scanf("%s", s);
- int a1, a2, b1, b2, c1, c2;
- int i = 0;
- a1 = i;
- while (s[i] != '+') {
- ++i;
- }
- a2 = i - 1;
- ++i;
- b1 = i;
- while (s[i] != '=') {
- ++i;
- }
- b2 = i - 1;
- ++i;
- c1 = i;
- while (s[i] && s[i] != '\n') {
- ++i;
- }
- c2 = i - 1;
- int sz_a = a2 - a1 + 1;
- int sz_b = b2 - b1 + 1;
- int sz_c = c2 - c1 + 1;
- if (rec(s, 0, 0, sz_a, a2, sz_b, b2, sz_c, c2)) {
- i = 0;
- while (s[i] && s[i] != '\n') {
- if (s[i] == '?')
- s[i] = '0';
- ++i;
- }
- printf("%s", s);
- }
- else {
- printf("No");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment