LINUX.ORG.RU

История изменений

Исправление Lrrr, (текущая версия) :

ладно. 25 строк на сишке, как заказывали

#include <stdint.h>
#include <stdio.h>

int main() {
  int bits[9];
  for (int mask = 0; mask < 19683; ++mask) {
    int64_t total = 9, cs = 9;
    for (int i = 8, cur = mask; i >= 0; --i, cur /= 3) {
      bits[i] = cur % 3;
      if (bits[i] == 2) { // 56
        total -= cs;
        cs = cs * 10 + i * ((cs >> 63) * 2 + 1);
      } else // 5 +- 6
        cs = i * (1 - bits[i] * 2);
      total += cs;
    }
    const char sign[] = "+-\0";
    if (total == 200) {
      printf("9");
      for (int i = 8; i >= 0; --i)
        printf("%c%d", sign[bits[i]], i);
      puts("");
    }
  }
}
$ gcc main.c && ./a.out | tr -d '\0' | bc -i | tail
98-7+65+43+2-1+0
200
98-7+65+43+2-1-0
200
98+76-5+43-2-10
200
9-8-7-6-5+4+3+210
200
9-8+7-6-5-4-3+210
200

Исправление Lrrr, :

ладно. 25 строк на сишке, как заказывали

#include <stdint.h>
#include <stdio.h>

int main() {
  int bits[9];
  for (int mask = 0; mask < 19683; ++mask) {
    int64_t total = 9, cs = 9;
    for (int i = 8, cur = mask, bit; i >= 0; --i, cur /= 3) {
      bits[i] = bit = cur % 3;
      if (bit == 2) { // 56
        total -= cs;
        cs = cs * 10 + i * ((cs >> 63) * 2 + 1);
      } else // 5 +- 6
        cs = i * (1 - bit * 2);
      total += cs;
    }
    const char sign[] = "+-\0";
    if (total == 200) {
      printf("9");
      for (int i = 8; i >= 0; --i)
        printf("%c%d", sign[bits[i]], i);
      puts("");
    }
  }
}
$ gcc main.c && ./a.out | tr -d '\0' | bc -i | tail
98-7+65+43+2-1+0
200
98-7+65+43+2-1-0
200
98+76-5+43-2-10
200
9-8-7-6-5+4+3+210
200
9-8+7-6-5-4-3+210
200

Исходная версия Lrrr, :

ладно. 25 строк на сишке, как заказывали

#include <stdint.h>
#include <stdio.h>

int main() {
  int bits[9];
  for (int mask = 0; mask < 19683; ++mask) {
    int64_t total = 9, cs = 9;
    for (int i = 8, cur = mask, bit; i >= 0; --i, cur /= 3) {
      bits[9 - i - 1] = bit = cur % 3;
      if (bit == 2) { // 56
        total -= cs;
        cs = cs * 10 + i * ((cs >> 63) * 2 + 1);
      } else // 5 +- 6
        cs = i * (1 - bit * 2);
      total += cs;
    }
    const char sign[] = "+-\0";
    if (total == 200) {
      printf("9");
      for (int i = 8; i >= 0; --i)
        printf("%c%d", sign[bits[9 - i - 1]], i);
      puts("");
    }
  }
}
$ gcc main.c && ./a.out | tr -d '\0' | bc -i | tail
98-7+65+43+2-1+0
200
98-7+65+43+2-1-0
200
98+76-5+43-2-10
200
9-8-7-6-5+4+3+210
200
9-8+7-6-5-4-3+210
200