이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

연립일차방정식의 해 계산기

연립일차방정식은 ax+by+c=0, a'x+b'y+c'=0 의 형태이다, 이때 연립일차방정식의 해를 자동으로 구해주는 프로그램을 만들어라.

  • 연립일차방정식의 풀이법은 가감법과 대입법이 있다. 가감법은 연립일차방정식의 두 일차방정식에 적당한 수를 곱한 후 두 방정식을 빼 한 미지수의 해를 구하고 다른 미지수의 해를 구할 수 있고, 대입법은 예를 들어 y = x + 2같이 연립일차방정식의 한 일차방정식을 적당하게 이항해 만든 후 다른 연립일차방정식의 일차방정식에 대입시켜 한 미지수의 값을 구한 후 다른 미지수 값을 구한다.
  • (x+2)/5 + (2y+2)/7 = 2/5, x/2 + y/3 = 5같이 a,a',b,b'에 분수가 들어가는 것은 제외시켜도 된다.
  • 해가 특수한 경우는 추가해야 한다.
  • 가감법을 추천드립니다.
  • 문제에 대한 문제가 있는 경우 알려주세요. 수정하겠습니다.

2022/02/09 22:35

고태욱

12개의 풀이가 있습니다.

from math import lcm
from fractions import Fraction as frac  #해를 float형이 아닌 분수 꼴로 나타내기 위해서

e1=list(map(int, input().split()))  #첫 번째 방정식
e2=list(map(int, input().split()))  #두 번째 방정식
A,B,C=e1
a,b,c=e2   #계수들을 따로 뽑음

if (A*b==a*B):   #해가 하나가 아닌 경우
    if (A*c==a*C):  #해가 무수히 많은 경우
        print('해가 무수히 많습니다.')
    else:  #해가 없는 경우
        print('해가 없습니다.')
else:
    l=lcm(B, b)
    f1=int(l/B)
    f2=int(l/b)
    for i in range(3):  #y의 계수를 맞추는 과정(가감법)
        e1[i]*=f1
        e2[i]*=f2
    e3=[]
    for j in range(3):  #y를 소거하고 x만 남기는 과정
        e3.append(e1[j]-e2[j])
    x=frac(e3[2], e3[0])  #x의 값
    y=(-A*x - C)/B   #구한 x의 값을 첫 번째 방정식에 대입하여 y을 구하는 과정
    print('x =',x,'y =',y)

2022/02/11 06:03

문지원

완벽합니다. 문제 올린 지 하루도 되지 않았는데 풀어주셔서 감사합니다~ - 고태욱, 2022/02/11 10:07
import re

s = input() #입력
s = re.sub('x+|y+|=0| ]',',',s) # x+ y+ 또는 =0 문자를 쉼표로 대체
eqs = [] 
eqs = s.split(',')#쉼표로 끊어서 eqs 리스트에 저장

while '' in eqs: 
    eqs.remove('') #eqs의 모든 필요없는 값('') 삭제

a = int(eqs[0]) 
b = int(eqs[1]) 
c = int(eqs[2]) 
d = int(eqs[3]) 
e = int(eqs[4]) 
f = int(eqs[5])#각각을 문자로 저장

if(a/d==b/e and b/e==c/f): #부정(해가 무수히 많음) 조건
    print("부정")

elif(a/d==b/e and b/e != c/f): #불능(해가 없음) 조건
    print("불능")

else:#아니다(해가 하나다) 
    print("x=" + str((d*f-c*e)/(a*e-b*d)))#x값 계산 및 문자로 변환하여 출력
    print("y=" + str((a*f-c*d)/(b*d-d*e)))#y값 계산 및 문자로 변환하여 출력

"""
x값 공식 유도

ax + by + c = 0
dx + ey + f = 0 에서

아래 식 양변에 a/d 를 곱해서 변형: 
ax + by + c = 0
ax + (ae/d)y+ af/d = 0,
가감법 시행:
(b - ae/d)y = af/d - c, (bd - ae)y = af - cd
-->> y = af-cd/bd-ae


y값 공식도 같은 방법으로 유도 가능


"""

2022/04/02 10:16

Dohyung Kim

eq_1 = input("첫번째 방정식의 계수를 입력해주세요(ex.x+3y+1=0이면 1,3,1):")     #방정식1입력
eq_2 = input("두번째 방정식의 계수를 입력해주세요(ex.x+3y+1=0이면 1,3,1):")     #방정식2입력
eq_1_list = eq_1.split(',')
eq_2_list = eq_2.split(',')
x_1 = int(eq_1_list[0]);y_1 = int(eq_1_list[1]);c_1 = int(eq_1_list[2])       
x_2 = int(eq_2_list[0]);y_2 = int(eq_2_list[1]);c_2 = int(eq_2_list[2])       #각 방정식의 계수들만 따로 뽑아오기
#해가 특수한 경우
if x_1/x_2 == y_1/y_2 == c_1/c_2:
  print("x는 모든실수, y는 모든 실수")
elif x_1/x_2 == y_1/y_2 != c_1/c_2:
  print("해가 없다")
#일반적인 경우
else:
  p = x_1/x_2                                                                 #가감법 사용을 위해 곱해주는 값을 p로 정의
  eq_list = []                                                                #가감법 계산 후 계수들을 x,y,상수 위치대로 정리하기 위한 리스트
  for i in range(3):
    eq_list.append(int(eq_1_list[i])-int(eq_2_list[i]))                       #가감법 계산 eq_list[0]==0
  y = -(int(eq_list[2]))/int(eq_list[1])                                      #ty+u = 0 의 일차방정식 해 계산
  x = (int(c_1)-int(y_1)*y)/int(x_1)                                          #위에서 구한 y값을 대입하여 x계산
  print(x,y)

2022/05/10 10:45

이승훈

include

int equation(const double var1, const double var2) { double t_var1[3]; double t_var2[3]; double x, y;

printf("연립 방정식>>\n");
printf("%lgx + %lgy = %lg\n", var1[0], var1[1], var1[2]);
printf("%lgx + %lgy = %lg\n", var2[0], var2[1], var2[2]);

/* x, y의 계수가 모두 0이면 잘못된 방정식 */
if(var1[0] == 0 && var1[1] == 0) {
    return 0;
}
if(var2[0] == 0 && var2[1] == 0) {
    return 0;
}

/* 두 방정식 x의 계수가 각각 0이면  */
if(var1[0] == 0 && var2[0] == 0) {
    y = var1[2] / var1[1];
    if(y != (var2[2] / var2[1])) {
        return 0;
    }
    printf("y = %lg\n", y);
    return 1;
}

/* 두 방정식 y의 계수가 각각 0이면  */
if(var1[1] == 0 && var2[1] == 0) {
    x = var1[2] / var1[0];
    if(x != (var2[2] / var2[0])) {
        return 0;
    }
    printf("x = %lg\n", x);
    return 1;
}

/* x의 계수를 같게 하기 위해서 두 방정식의 x계수를 상대방 방정식에 곱함 */
for(int i = 0; i < 3; i++) {
    t_var1[i] = var1[i] * var2[0];
    t_var2[i] = var2[i] * var1[0];
}
if(var1[0] != 0) {
    y = (t_var2[2] - t_var1[2]) / (t_var2[1] - t_var1[1]);
    x = (var1[2] - var1[1] * y) / var1[0];
} else {
    y = var1[2] / var1[1];
    x = (var2[2] - var2[1] * y) / var2[0];
}

printf("\n방정식 해>>\n");
printf("x = %lg\n", x);
printf("y = %lg\n", y);

return 1;

}

int main() { double var1[3]; double var2[3]; printf("방정식 a₁x + b₁y = c₁의 \n a₁ b₁ c₁ 실수값 입력: "); scanf("%lf %lf %lf", &var1[0], &var1[1], &var1[2]); printf("방정식 a₂x + b₂y = c₂의 \n a₂ b₂ c₂ 실수값 입력: "); scanf("%lf %lf %lf", &var2[0], &var2[1], &var2[2]);

if(equation(var1, var2) == 0) {
    fprintf(stderr, "\n방정식 오류...\n");
    return 1;
}

return 0;

}

2022/06/03 07:39

teayoung kwon

자바로 풀어봤습니다.

import java.util.Scanner;

public class test {
    // x 계수 찾기
    public static Integer findCoeffx(String equation) {

        if(equation.split("x|X")[0].equals("")) {
            return 1;
        }else if(equation.split("x|X")[0].equals("-")){
            return -1;
        }else if((equation.contains("x")|equation.contains("X"))==false){
            return 0;
        }else {
            return Integer.parseInt(equation.split("x|X")[0]);
        }
    }
    // y 계수 찾기
    public static Integer findCoeffy(String equation) {

        if(equation.split("x|X|y|Y")[1].equals("+")) {
            return 1;
        }else if(equation.split("x|X|y|Y")[1].equals("-")){
            return -1;
        }else if(equation.split("y|Y")[0].equals("")|equation.split("y|Y")[0].equals("-")) {
            return 0;
        }else if((equation.contains("y")|equation.contains("Y"))==false) {
            return 0;
        }else {
            return Integer.parseInt(equation.split("x|X|y|Y")[1]);
        }
    }
    // 상수 찾기
    public static Integer findConstant(String equation) {
        if(equation.contains("=")==false) {
            return 0;
        }else {
            return Integer.parseInt(equation.split("=")[1]);
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String[] equations = new String[2];
        int[] coeffx = new int[2];
        int[] coeffy = new int[2];
        int[] constant = new int[2];

        // 일차방정식 입력 받기
        int count = 0;      
        float answery, answerx;
        String inputX, inputY;      

        while(true) {
            System.out.printf("%d번째 일차방정식(ax+by=c):", count+1);
            equations[count] = scan.next();

            // 일차방정식의 계수 뽑아서 배열에 저장
            coeffx[count] = findCoeffx(equations[count]);
            coeffy[count] = findCoeffy(equations[count]);
            constant[count] = findConstant(equations[count]);

            // 만약 계수가 0이면 다시 입력
            if(coeffx[count]==0|coeffy[count]==0|constant[count]==0) {
                System.out.println("잘못 입력하셨습니다. 다시 입력하시오.");
            }else {
                count++;
            }

            // 방정식을 2개 입력했는지 
            if(count==2) {
                break;
            }
        }

        // y 값 구하기
        int diffy = coeffy[0]*coeffx[1] - coeffy[1]*coeffx[0];
        int diffConstant = constant[0]*coeffx[1] - constant[1]*coeffx[0];       
        answery = (float)diffConstant/diffy;
        // x 값 구하기
        answerx = (constant[0]-coeffy[0]*answery)/coeffx[0];

        // 결과 출력
        System.out.printf("x : %f\n", answerx);
        System.out.printf("y : %f", answery);
    }
}

2022/06/12 19:57

유로

# ax + by + c = 0
# dx + ey + f = 0

from fractions import Fraction as frac

eq1 = list(map(int, input("첫번째 연립방정식의 계수>> ").split()))
eq2 = list(map(int, input("두번째 연립방정식의 계수>> ").split()))

a = eq1[0]
b = eq1[1]
c = eq1[2]
d = eq2[0]
e = eq2[1]
f = eq2[2]

if a/d == b/e and b/e != c/f:
    print("해가 없음")
elif a/d == b/e == c/f:
    print("x, y는 모든 실수")
else:
    g_eq1 = list(map(lambda k: k*d, eq1))
    g_eq2 = list(map(lambda k: k*a, eq2))
    pm = []
    for i in range(0,3):
        pm.append(g_eq1[i] - g_eq2[i])
    y = frac(-(pm[2]), pm[1])
    x = frac(-(b*y)-c, a)
    print("x = {0}, y = {1}".format(x, y))

초보라 간단한 문제도 오래 걸리네요 열심히 해보겠습니당

2022/07/09 19:25

Estelle L

# Codingdojang 273
import numpy as np
equ_1_a,equ_1_b,equ_1_c=input("일차방정식_1을 입력 하시오.(ax+by+c=0):").split()
equ_2_a,equ_2_b,equ_2_c=input("일차방정식_2을 입력 하시오.(a'x+b'y+c'=0):").split()
list_1=[equ_1_a,equ_1_b,equ_1_c]
list_2=[equ_2_a,equ_2_b,equ_2_c]
list_1_int=np.array([int(i) for i in list_1]) # list는 나눗셈 연산이 안돼서 numpy array를 적용 하였습니다.
list_2_int=np.array([int(j) for j in list_2])

list_1_int=list_1_int/list_1_int[0]
list_2_int=list_2_int/list_2_int[0]

new_eq=list_1_int-list_2_int

ans_y=-1*new_eq[2]/new_eq[1]
ans_x=-1*(list_1_int[1]*ans_y+list_1_int[2])

print("X 값:%d,Y 값:%d"%(ans_x,ans_y))

2022/09/06 14:50

나무늘보

p1 = input("첫번째 연립방정식의 계수를 입력하시오 (ex.x+2y+3 = 0  이면 1,2,3):")
p2 = input("두번째 연립방정식의 계수를 입력하시오 (ex.x+2y+3 = 0  이면 1,2,3):")

p1_list = p1.split(',')
p2_list = p2.split(',')

print(p1_list)
print(p2_list)

if int(p1_list[0]) /int(p2_list[0]) == int(p1_list[1]) / int(p2_list[1]) == int(p1_list[2]) / int(p2_list[2]) :
    print('해가 무수히 많습니다')

elif int(p1_list[0]) /int(p2_list[0]) == int(p1_list[1]) / int(p2_list[1]) != int(p1_list[2]) / int(p2_list[2]) :
    print('해가 없습니다')

else : 
    m = int(p2_list[0]) / int(p1_list[0])
    y = -(m*int(p1_list[2])-int(p2_list[2])) / (m*int(p1_list[1])-int(p2_list[1]))
    x = -(int(p1_list[1])*y+int(p1_list[2]))/ int(p1_list[0])
    print(f'X값 : {x:.4f} Y값 : {y:.4f}')

2022/11/21 14:38

DH K

feq = list(map(int,input("Input a,b,c (ax+by+c=0):".split(',')))
seq = list(map(int,input("Input a',b',c' (a'x+b'y+c'=0):".split(',')))
lists_1 = []
x = 0
y = 0
div_1 = feq[0]
div_2 = seq[0]
for i in range(3):
   feq[i] = feq[i]/div_1
   seq[i] = seq[i]/div_2
for j,k in zip(feq,seq):
   lists_1.append(round(float(j-k),2))
if lists_1[2] == 0:
   y = 0
else:
   y = lists_1[2]*(-1)/lists_1[1]
feq[1] = feq[1] * y
x = (feq[1]*(-1)+feq[2]*(-1))/feq[0]
print("X=",x," ","Y=",y)

2023/07/06 11:50

siu yoon

### ax + by + c = 0, ex + fy + g = 0
a, b, c, e, f, g = map(int, input().split())
x = -(b*(((a*g)-(c*e))/((b*e)-(a*f))) + c) / a
y = ((a*g) - (c*e)) / ((b*e) - (a*f))
print(x, y)

2023/08/04 22:15

Hawk Lee

def ll(a,b,c,d,e,f):   # ax + by + c = 0, dx + ey + f = 0
    if a == d and b == e:   #x의 계수와 y의 계수가 동일한 상황
        if c == f:   # 상수가 동일한 상황 => 해가 무수히 많음
            print(" 해가 무수히 많습니다.")
            sys.exit();
        else:    # 상수가 동일하지 않음 => 문제의 오류
            print("문제에 오류가 있습니다.")
            sys.exit();
    y = ((f*a/d) - c) / (b - (e*a/d))
    x = ((f*b/e) - c) / (a - (d*b/e))
    print(x,y)

2024/10/13 19:26

송승민

import numpy as np

num1 = input("첫번째 연립 방정식의 계수를 입력하세요(예: x + 2y = 3 => 1,2,3): ")
num1_arry = num1.split(",")

num2 = input("두번째 연립 방정식의 계수를 입력하세요(예: x + 2y = 3 => 1,2,3): ")
num2_arry = num2.split(",")

a1 = int(num1_arry[0])
b1 = int(num1_arry[1])
c1 = int(num1_arry[2])

a2 = int(num2_arry[0])
b2 = int(num2_arry[1])
c2 = int(num2_arry[2])

a = np.array([[a1, b1],
             [a2, b2]])
b = np.array([c1, c2])

if a1/a2 == b1/b2 and b1/b2 == c1/c2:
    print("해가 무수히 많다")
elif a1/a2 == b1/b2 and b1/b2 != c1/c2:
    print("해가 없다")
else:
    s = np.linalg.solve(a, b)
    print("x = " + str(s[0]) + ", y = " + str(s[1]))

2024/10/16 17:18

rgone6

목록으로