문제는 2개입니다. 문제1 네 개의 4로 257을 만드세요. 문제2 다섯 개의 4로 65532를 만드세요. 단, 조건이 있습니다. 이 수들을 만들 때 주어진 개수의 4, 덧셈, 뺄셈, 곱셈, 나눗셈, 거듭제곱만 사용 가능합니다. 조금 생각하면 누구나 맞힐 수 있습니다.
18개의 풀이가 있습니다.
import math
def solution(N, number, cnt):
#N/N and N
if N == number:
return 1
answer = []
stack = [0]
pow_ = [(N, str(N))]
start = 1
while True:
r = int(str(N) * start)
if math.pow(N, r) > number:
stack.append(set(pow_))
break
if math.pow(N, start) == number:
answer.append("%d^%d" %(N, start))
pow_.append((math.pow(N, r), "%d^%d" %(N, r)))
start += 1
for i in range(2, cnt + 1): #number of N
arr = {(int(str(N) * i), str(N) * i)}
for j in range(1, i // 2 + 1):
for k, k_s in stack[j]: #k = N * j
for l, l_s in stack[i - j]: #l = N * (i - j)
arr.add((k + l, k_s + "+" + l_s))
if k > l:
arr.add((k - l, k_s + "-" + l_s))
else:
arr.add((l - k, l_s + "-" + k_s))
arr.add((k * l, k_s + "*" + l_s))
if k != 0:
arr.add((l // k, l_s + "/" + k_s))
if l != 0:
arr.add((k // l, k_s + "/" + l_s))
for n, s in arr:
if number == n and s.count("4") == cnt:
answer.append(s)
stack.append(arr)
return answer
if __name__ == "__main__":
first_Q = solution(4, 257, 4)
for i in first_Q:
print(i)
second_Q = solution(4, 65532, 5)
for i in second_Q:
print(i)
후... 할말하않...
import math
#1 4의 4승 + 4 / 4
print(int(math.pow(4,4) + 4/4))
#2 4의 4승 * 4의 4승 - 4
print(int(math.pow(4,4) * math.pow(4,4) - 4))
#include<stdio.h>
#include<math.h>
int main()
{
int i;
i=pow(4,4)+4/4;
printf("4^4+4/4=%d\n",i);
i=pow(4,4)*pow(4,4)-4;
printf("4^4*4^4-4=%d",i);
getch();
return 0;
}
이건 코딩이라긴 보단 수수깨끼네요
관건은 숫자를 키우는 거네요. 거듭제곱을 잘 이용하는게 포인트인 듯 합니다. 우선 순위를 명시하기 위해 괄호를 사용했습니다.
(4 ** 4) + (4 // 4)
(4 4) * (4 4) -4
#1. 네개의 4로 257을 만들기
import itertools
calc = ["**","*",'+',"/","-",]
for i in itertools.product(calc,calc,calc): # 리스트 경우의수 만들기
expr = "".join(["4"+j for j in i]+["4"]) ## 4가 포함된 경우의 수
if expr.count("4**4**4") > 0: #큰수 계산 제거(시간절약)
continue
sum = eval(expr) # 산식계산
if sum == 257 or sum == 257.0:
print(expr,"=",sum )
#2. 다섯개의 4로 65532 만들기
import itertools
calc = ["**","*",'+',"/","-",]
for i in itertools.product(calc,calc,calc,calc): # 리스트 경우의수 만들기
expr = "".join(["4"+j for j in i]+["4"]) ## 4가 포함된 경우의 수
if expr.count("4**4**4") > 0: #큰수 계산 제거(시간절약)
continue
sum = eval(expr) # 산식계산
if sum == 65532 or sum == 65532.0:
print(expr,"=",sum )
def make257with4():
"""
257 = 2 ** 8 + 1
257 = 4 ** 4 + 4/4
"""
return 4 ** 4 + 4 /4
def make65532with4():
"""
65532 = 4 * 3 * 43 * 127
65532 = 4 * 129 * 127
65532 = 4 * (128 + 1) * (128 - 1)
65532 = 4 * (2**7 + 1) * (2**7 - 1)
65532 = 4 * (2**14 - 1)
65532 = 4 * (4**7 - 1)
65532 = 4**8 - 4
65532 = 4**(4+4) - 4
"""
return 4 ** 4 + 4 ** 4 - 4
num = [4,4,4,4,4]
print(int(num[0]**num[1]+num[2]/num[3]))
print(num[0]**num[1]*num[2]**num[3]-num[4])
#1
from math import *
print((4**4)+(4/4))
#2
print((4*4)**(4)-(sqrt(4)+sqrt(4)))
제곱근을 이용했는데 조건에 맞는지 모르겠네요..
dart
import 'dart:math';
void main(List<String> arguments) {
print(pow(4, 4) + 4 ~/ 4);
print(pow(4, 4) * pow(4, 4) - 4);
}
using System;
using System.Collections.Generic;
namespace solution2
{
class Program
{
static void Main(string[] args)
{
//int N = 257;
//int trial = 4;
int N = 65532;
int trial = 5;
List<string> list = new List<string>();
list.Add("없슴");
makeN(1, 4, "4", N, trial, list);
if(list.Count == 1)
makeN(2, Math.Pow(4,4), "4^^4", N, trial, list);
Console.WriteLine("\n {0} = {1}", list[list.Count-1], N);
}
private static void makeN(int cnt, double sum, string str, int N, int trial, List<string> list)
{
if(sum == N && cnt == trial)
{
list.Add(str);
return;
}
if (cnt > trial)
return;
makeN(cnt + 1, sum * 4, str + " x 4 ", N, trial, list);
makeN(cnt + 1, sum + 4, str + " + 4 ", N, trial, list);
makeN(cnt + 1, sum - 4, str + " - 4 ", N, trial, list);
int tmp = (int)Math.Pow(sum, 4);
makeN(cnt + 1, tmp, str + "^^4 ", N, trial,list);
tmp = (int)Math.Pow(4, 4);
makeN(cnt + 2, sum * tmp, str + " x 4^^4", N, trial,list);
makeN(cnt + 2, sum + tmp, str + " + 4^^4", N, trial, list);
makeN(cnt + 2, sum - tmp, str + " - 4^^4", N, trial, list);
makeN(cnt + 2, sum + 1, str + " + 4/4 ", N, trial,list);
makeN(cnt + 2, sum - 1, str + " - 4/4 ", N, trial,list);
}
}
}
def makeSu(cnt, sum, s):
global list
global N
global su
if cnt == N and sum == su:
list.append(s)
return
if cnt >= N:
return
makeSu(cnt + 1, sum + 4, s + ' + 4')
makeSu(cnt + 1, sum - 4, s + ' - 4')
makeSu(cnt + 1, sum * 4, s + ' x 4')
makeSu(cnt + 1, sum ** 4, s + ' ^^4')
makeSu(cnt + 2, sum + (4 * 4), s + ' + 4 x 4')
makeSu(cnt + 2, sum - (4 * 4), s + ' - 4 x 4')
makeSu(cnt + 2, sum * (4 ** 4), s + ' x 4^^4')
makeSu(cnt + 2, sum + (4 ** 4), s + ' + 4^^4')
makeSu(cnt + 2, sum + (4 / 4), s + ' + 4/4')
makeSu(cnt + 2, sum - (4 / 4), s + ' - 4/4')
list = ['없음']
# su = 257
# N = 4
su = 65532
N = 5
makeSu(1, 4, '4')
print(list[-1] , '= ', su)