#include #include #include static int FromBin(const char *p) { size_t b = strlen(p) - 1; int v = 0; int f; for(f = 0; p[f]; f++, b--) { if (p[f] == '1') { v |= 1 << b; } } return v; } static void Chomp(char *p) { size_t l = strlen(p); while(l && p[l-1] == '\n') { p[--l] = 0; } } int main(void) { char nums[1000][14] = {0}; char work[1000][14] = {0}; char buff[80]; int bit[12] = {0}; int count = 0; char str[13] = {0}; int b; int f; int n; int oxygen; int co2; int lines = 0; count = 0; while(fgets(buff, sizeof buff, stdin)) { Chomp(buff); strcpy(nums[count++], buff); } lines = count; count = 0; memcpy(work, nums, sizeof nums); b = 0; while(count != 1) { for(f = 0; f < 12; f++) { bit[f] = 0; } count = 0; for(n = 0; n < lines; n++) { if (work[n][0]) { for(f = 0; f < 12; f++) { if (work[n][f] == '1') { bit[f]++; } } count++; } } if (count == 1) { for(n = 0; n < lines; n++) { if (work[n][0]) { oxygen = FromBin(work[n]); } } } else { char c; c = bit[b] >= count/2.0 ? '1':'0'; for(n = 0; n < lines; n++) { if (work[n][b] != c) { work[n][0] = 0; } } if (b < 11) { b++; } } } count = 0; memcpy(work, nums, sizeof nums); b = 0; while(count != 1) { for(f = 0; f < 12; f++) { bit[f] = 0; } count = 0; for(n = 0; n < lines; n++) { if (work[n][0]) { for(f = 0; f < 12; f++) { if (work[n][f] == '1') { bit[f]++; } } count++; } } if (count == 1) { for(n = 0; n < lines; n++) { if (work[n][0]) { co2 = FromBin(work[n]); } } } else { char c; c = (bit[b] < count/2.0) ? '1':'0'; for(n = 0; n < lines; n++) { if (work[n][b] != c) { work[n][0] = 0; } } if (b < 11) { b++; } } } printf("oxygen %d\n", oxygen); printf("co2 %d\n", co2); printf("product %d\n", oxygen * co2); return 0; }