미누에요
수학 문제 프로그래밍으로 해결하기 본문
여자친구의 지인이 수학 문제를 파이썬으로 해결하는 방법을 어려워한다길래 승부욕이 생겨서 한번 해보았다.
문제의 내용은 아래와 같다.
근데 문제는... 영어로 된 문장들이라 처음부터 난관이었다는 것... 하지만 도움을 받아 규칙성을 찾아냈다.
우선, k가 짝수이면 -1을 곱하고, k가 홀수이면 +1을 곱한다. 즉, 짝수이면 음수, 홀수이면 양수의 값을 더한다는 말이다.
k=1부터 n까지 이므로 for문을 이용하여 아래와 같이 구현하였다.
for(int k=1;k<=n;k++)
그리고 시그마에 해당하는 수식을 정리하여 하나의 함수로 빼내었다.
if문을 사용하여 짝수일 때는 뺄셈을, 홀수일 때는 덧셈을 연산하도록 작성했다.
완성된 시그마 함수는 아래와 같다.
double Sigmama(int n)
{
double result = 0.0;
if(n==0){
result = 0.0;
}
for(int k=1;k<=n;k++){
if(k%2==0){
result -= (double)1/(k*k);
}
else if(k%2==1){
result += (double)1/(k*k);
}
}
return result;
}
나눗셈이 수행되므로 반환값은 실수형인 double 형의 함수로 구현하였다.
그리고 main 함수에서 어떤 숫자까지 검사할 것인지를 정하고, 수식을 코드로 작성하였다.
int main(void)
{
int n = 105;
int index_n = 0;
double value_Sn = 0.0;
long double Sn_Sn_1 = 0.0;
for(int k=1;k<=n;k++){
if(fabs(Sigmama(k) - Sigmama(k-1))<0.0001){
index_n = k;
value_Sn = Sigmama(k);
Sn_Sn_1 = (Sigmama(k) - Sigmama(k-1));
printf("%llf\n",fabs(Sigmama(k)-Sigmama(k-1)));
break;
}
}
Sn_Sn_1 = fabs(Sn_Sn_1);
printf("n : %d\nSn : %lf\nSn-Sn-1 : %llf\n",index_n,value_Sn,Sn_Sn_1);
return 0;
}
실수했던 것은 C언어에서 실수형 데이터에 절댓값을 씌울 때 abs함수가 아닌 fabs 함수를 사용해야 한다는 점이다.
이 문제 때문에 값이 자꾸 사라져서 한참 걸렸다.
최종 코드 (C99)
#include<stdio.h>
#include<stdlib.h>
double Sigmama(int n)
{
double result = 0.0;
if(n==0){
result = 0.0;
}
for(int k=1;k<=n;k++){
if(k%2==0){
result -= (double)1/(k*k);
}
else if(k%2==1){
result += (double)1/(k*k);
}
}
return result;
}
int main(void)
{
int n = 105;
int index_n = 0;
double value_Sn = 0.0;
long double Sn_Sn_1 = 0.0;
for(int k=1;k<=n;k++){
if(fabs(Sigmama(k) - Sigmama(k-1))<0.0001){
index_n = k;
value_Sn = Sigmama(k);
Sn_Sn_1 = (Sigmama(k) - Sigmama(k-1));
printf("%llf\n",fabs(Sigmama(k)-Sigmama(k-1)));
break;
}
}
printf("n : %d\nSn : %lf\nSn-Sn-1 : %llf\n",index_n,value_Sn,fabs(Sn_Sn_1));
return 0;
}
아, 그리고 요청한 코드는 파이썬이었는데 난 C언어한다고 다 까먹어서 챗GPT한테 변환해달라고 부탁했다 ^___^
최종 코드 (Python)
def Sigmama(n):
result = 0.0
if n == 0:
return 0.0
for k in range(1, n + 1):
if k % 2 == 0:
result -= 1.0 / (k * k)
else:
result += 1.0 / (k * k)
return result
def main():
n = 1000
index_n = 0
value_Sn = 0.0
Sn_Sn_1 = 0.0
for k in range(1, n + 1):
if abs(Sigmama(k) - Sigmama(k - 1)) < 0.0001:
index_n = k
value_Sn = Sigmama(k)
Sn_Sn_1 = (Sigmama(k) - Sigmama(k - 1))
break
Sn_Sn_1 = abs(Sn_Sn_1)
print(f"n : {index_n}\nSn : {value_Sn}\nSn-Sn-1 : {Sn_Sn_1}")
if __name__ == "__main__":
main()
이 문제의 정답을 모르기에 소스 코드 상의 오류가 존재할 수 있다.
프로그램을 실행하는 데 범위를 1~105까지로 검사하였을 때 n 값은 100 이 나왔다.
이 글을 보는 사람들 중에 수정사항이나 오류가 있다면 짚어주면 좋겠다.
빨리 C언어 끝내고 파이썬 다시 봐야겠다 ^________________^
'Project' 카테고리의 다른 글
[Web Project] 네이버 웹 클론코딩하기 (1) (2) | 2023.12.29 |
---|---|
(3) 2048 구현 - 3 (0) | 2023.07.15 |
2048 구현 (2) (0) | 2023.06.03 |
2048 구현 (1) (0) | 2023.06.03 |