코딩도장

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

연립일차방정식은 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개의 풀이가 있습니다. 1 / 2 Page

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日 10:07 M D
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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값 공식도 같은 방법으로 유도 가능
"""
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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("방정식 a1x + b1y = c1의 \n a1 b1 c1 실수값 입력: "); scanf("%lf %lf %lf", &var1[0], &var1[1], &var1[2]); printf("방정식 a2x + b2y = c2의 \n a2 b2 c2 실수값 입력: "); 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))

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

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
# 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))
댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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

댓글 작성은 로그인이 필요합니다.
(注記) 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

(注記) 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
풀이 작성은 로그인이 필요합니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 12
python x 9
기 타 x 2
java x 1
코딩도장 © 2014 · 문의 [email protected]
피드백 · 개인정보취급방침 · RSS

AltStyle によって変換されたページ (->オリジナル) /