1 부터 9 까지의 숫자를 이용하여 1 부터 1000 만들기 [Matlab 코드]

written by jjycjn   2016. 9. 2. 16:32

관련글 보기:

1 부터 9 까지의 숫자를 이용하여 100 만들기

1 부터 9 까지의 숫자를 이용하여 100 만들기 [Matlab 코드]


Matlab 코드를 한번만 돌려보기에는 아까운 생각이 들어서 코드를 좀 더 활용해 보기로 하였다. 1 부터 9 까지의 숫자를 순서대로 사용하고, 덧셈과 뺄셈만을 이용하여 1부터 1000까지의 숫자를 모두 만들 수 있는지 확인해 보자. 하지만 결과를 모두 출력하기는 힘드므로 (100인 경우만 해도 11개의 답이 있으므로, 1 부터 1000까지의 모든 숫자의 경우 대략적으로 5개의 해가 있다고 가정해도 총 5000개의 답이 생겨버린다) 주어진 답이 하나라도 나오면 바로 다음 숫자로 넘어가도록 코드를 작성해 보았다. 작성한 코드는 아래와 같다.

allowfrontminus = 0;
for n=1:1000
flag = 0;
for a1 = 1:3
    if flag == 1; break; end
    if a1 == 1; sum1 = char(strcat(num2str(1), num2str(2)));
    elseif a1 == 2; sum1 = char(strcat(num2str(1), {' + '}, num2str(2)));
    else sum1 = char(strcat(num2str(1), {' - '}, num2str(2)));
    end
for a2 = 1:3
    if flag == 1; break; end
    if a2 == 1; sum2 = char(strcat(num2str(sum1), num2str(3)));
    elseif a2 == 2; sum2 = char(strcat(num2str(sum1), {' + '}, num2str(3)));
    else sum2 = char(strcat(num2str(sum1), {' - '}, num2str(3)));
    end
for a3 = 1:3
    if flag == 1; break; end
    if a3 == 1; sum3 = char(strcat(num2str(sum2), num2str(4)));
    elseif a3 == 2; sum3 = char(strcat(num2str(sum2), {' + '}, num2str(4)));
    else sum3 = char(strcat(num2str(sum2), {' - '}, num2str(4)));
    end
for a4 = 1:3
    if flag == 1; break; end
    if a4 == 1; sum4 = char(strcat(num2str(sum3), num2str(5)));
    elseif a4 == 2; sum4 = char(strcat(num2str(sum3), {' + '}, num2str(5)));
    else sum4 = char(strcat(num2str(sum3), {' - '}, num2str(5)));
    end
for a5 = 1:3;
    if flag == 1; break; end
    if a5 == 1; sum5 = char(strcat(num2str(sum4), num2str(6)));
    elseif a5 == 2; sum5 = char(strcat(num2str(sum4), {' + '}, num2str(6)));
    else sum5 = char(strcat(num2str(sum4), {' - '}, num2str(6)));
    end
for a6 = 1:3
    if flag == 1; break; end
    if a6 == 1; sum6 = char(strcat(num2str(sum5), num2str(7)));
    elseif a6 == 2; sum6 = char(strcat(num2str(sum5), {' + '}, num2str(7)));
    else sum6 = char(strcat(num2str(sum5), {' - '}, num2str(7)));
    end
for a7 = 1:3
    if flag == 1; break; end
    if a7 == 1; sum7 = char(strcat(num2str(sum6), num2str(8)));
    elseif a7 == 2; sum7 = char(strcat(num2str(sum6), {' + '}, num2str(8)));
    else sum7 = char(strcat(num2str(sum6), {' - '}, num2str(8)));
    end
for a8 = 1:3
    if flag == 1; break; end
    if a8 == 1; sum8 = char(strcat(num2str(sum7), num2str(9)));
    elseif a8 == 2; sum8 = char(strcat(num2str(sum7), {' + '}, num2str(9)));
    else sum8 = char(strcat(num2str(sum7), {' - '}, num2str(9)));
    end
    if allowfrontminus == 1; sum9 = char(strcat({'- '}, num2str(sum8)));
    else sum9 = sum8;
    end
    if str2num(sum9) == n; disp(char(strcat(sum9, {' = '}, num2str(str2num(sum9))))); flag = 1;
    end
end; end; end; end; end; end; end; end
if flag == 0; disp(strcat('There is no solution for n=', num2str(n)));
end; end

1~9 까지의 숫자로 만들 수 있는 숫자가 그렇게 많지는 않을 것이라 생각했는데, 실제로 코드를 실행시켜 보니 1 부터 1000 까지 중 거의 대부분의 숫자가 1~9 로부터 만들 수 있었다. 이 중 처음 1 부터 100까지에 대한 해답은 아래와 같다. 

>> make1to1000
12 + 34 + 5 - 67 + 8 + 9 = 1
123 + 4 - 56 - 78 + 9 = 2
123 - 45 - 6 - 78 + 9 = 3
12 + 3 - 4 + 5 - 6 - 7 - 8 + 9 = 4
12 - 34 + 5 - 67 + 89 = 5
12 + 34 + 56 - 7 - 89 = 6
1 + 23 + 4 - 5 - 6 + 7 - 8 - 9 = 7
12 + 3 + 4 + 5 - 6 + 7 - 8 - 9 = 8
12 - 34 - 56 + 78 + 9 = 9
123 - 45 - 67 + 8 - 9 = 10
12 + 34 - 5 - 6 - 7 - 8 - 9 = 11
123 + 45 - 67 - 89 = 12
12 - 34 + 5 + 6 + 7 + 8 + 9 = 13
12 + 34 - 56 + 7 + 8 + 9 = 14
123 - 45 + 6 - 78 + 9 = 15
12 + 3 + 4 - 5 - 6 + 7 - 8 + 9 = 16
1 + 23 + 4 + 5 - 6 + 7 - 8 - 9 = 17
12 + 3 + 4 - 5 - 6 - 7 + 8 + 9 = 18
12 + 34 - 5 + 67 - 89 = 19
123 + 4 - 5 - 6 - 7 - 89 = 20
123 - 4 - 5 - 6 - 78 - 9 = 21
123 - 4 + 5 - 6 - 7 - 89 = 22
12 + 34 - 5 + 6 - 7 - 8 - 9 = 23
123 - 4 - 5 + 6 - 7 - 89 = 24
12 + 34 - 5 - 6 + 7 - 8 - 9 = 25
123 - 4 - 5 - 6 + 7 - 89 = 26
12 + 34 - 5 - 6 - 7 + 8 - 9 = 27
123 - 45 - 67 + 8 + 9 = 28
123 + 4 - 5 - 6 - 78 - 9 = 29
123 + 4 + 5 - 6 - 7 - 89 = 30
123 - 4 + 5 - 6 - 78 - 9 = 31
123 + 4 - 5 + 6 - 7 - 89 = 32
123 - 4 - 5 + 6 - 78 - 9 = 33
123 + 4 - 5 - 6 + 7 - 89 = 34
12 + 34 + 5 - 6 + 7 - 8 - 9 = 35
123 - 4 + 5 - 6 + 7 - 89 = 36
12 + 34 + 5 - 6 - 7 + 8 - 9 = 37
123 + 4 - 5 - 67 - 8 - 9 = 38
123 + 4 + 5 - 6 - 78 - 9 = 39
123 - 4 + 5 - 67 - 8 - 9 = 40
123 + 4 - 5 + 6 - 78 - 9 = 41
123 + 4 + 5 + 6 - 7 - 89 = 42
123 - 4 + 5 + 6 - 78 - 9 = 43
123 + 4 + 5 - 6 + 7 - 89 = 44
12 + 34 - 5 - 6 - 7 + 8 + 9 = 45
123 + 4 - 5 + 6 + 7 - 89 = 46
123 + 4 - 56 - 7 - 8 - 9 = 47
123 + 4 + 5 - 67 - 8 - 9 = 48
123 - 4 + 5 - 6 - 78 + 9 = 49
12 + 3 + 4 - 56 + 78 + 9 = 50
123 + 4 + 5 + 6 - 78 - 9 = 51
12 - 3 + 45 + 6 - 7 + 8 - 9 = 52
123 - 4 - 56 + 7 - 8 - 9 = 53
123 + 4 - 5 - 67 + 8 - 9 = 54
123 - 4 - 56 - 7 + 8 - 9 = 55
123 + 4 + 5 + 6 + 7 - 89 = 56
123 + 4 + 5 - 6 - 78 + 9 = 57
123 - 4 + 5 - 67 - 8 + 9 = 58
123 + 4 - 5 + 6 - 78 + 9 = 59
123 - 45 + 6 - 7 - 8 - 9 = 60
123 + 4 - 56 + 7 - 8 - 9 = 61
123 - 45 - 6 + 7 - 8 - 9 = 62
123 + 4 - 56 - 7 + 8 - 9 = 63
123 + 4 + 5 - 67 + 8 - 9 = 64
123 + 4 - 56 - 7 - 8 + 9 = 65
123 + 45 - 6 - 7 - 89 = 66
12 + 34 + 5 + 6 - 7 + 8 + 9 = 67
12 - 3 + 45 + 6 + 7 - 8 + 9 = 68
123 + 4 + 5 + 6 - 78 + 9 = 69
12 - 3 + 45 + 6 - 7 + 8 + 9 = 70
123 - 4 - 56 + 7 - 8 + 9 = 71
123 + 4 - 5 - 67 + 8 + 9 = 72
123 - 4 - 56 - 7 + 8 + 9 = 73
123 - 45 + 6 + 7 - 8 - 9 = 74
123 + 45 - 6 - 78 - 9 = 75
123 - 45 + 6 - 7 + 8 - 9 = 76
123 + 4 - 56 + 7 + 8 - 9 = 77
123 + 45 + 6 - 7 - 89 = 78
123 + 4 - 56 + 7 - 8 + 9 = 79
123 + 45 - 6 + 7 - 89 = 80
123 + 4 - 56 - 7 + 8 + 9 = 81
123 + 4 + 5 - 67 + 8 + 9 = 82
12 + 3 + 4 + 56 + 7 - 8 + 9 = 83
123 + 45 - 67 - 8 - 9 = 84
12 + 3 + 4 + 56 - 7 + 8 + 9 = 85
12 + 34 - 56 + 7 + 89 = 86
123 + 45 + 6 - 78 - 9 = 87
123 - 4 + 56 - 78 - 9 = 88
12 + 3 + 4 - 5 + 6 + 78 - 9 = 89
123 - 45 + 6 + 7 + 8 - 9 = 90
12 + 34 - 5 + 67 - 8 - 9 = 91
123 + 45 + 6 + 7 - 89 = 92
123 + 45 - 6 - 78 + 9 = 93
123 - 45 + 6 - 7 + 8 + 9 = 94
123 + 4 - 56 + 7 + 8 + 9 = 95
123 + 4 + 56 - 78 - 9 = 96
12 + 3 - 4 + 5 - 6 + 78 + 9 = 97
123 - 4 - 5 - 6 + 7 - 8 - 9 = 98
12 + 3 + 4 + 56 + 7 + 8 + 9 = 99
123 + 45 - 67 + 8 - 9 = 100


만약에 1 부터 1000까지 모든 결과를 확인하고 싶다면 아래 텍스트 파일을 열어보면 된다.

make1to1000.txt


1~9와 덧셈 뺄셈으로 만들 수 없는 최초의 수는 160이다. 그 뒤로 178, 196, 211, 219로 수가 게속 이어지는데, 혹시나 하고 이 수열을 검색해 보았더니, 역시 OEIS에 리스트가 존재한다. 수열번호는 A171225.

  ::  
  • 공유하기  ::