Minwoo Dev.

수학 문제 프로그래밍으로 해결하기 본문

Project

수학 문제 프로그래밍으로 해결하기

itisminu 2023. 9. 6. 22:47
728x90
반응형
SMALL

여자친구의 지인이 수학 문제를 파이썬으로 해결하는 방법을 어려워한다길래 승부욕이 생겨서 한번 해보았다.

 

문제의 내용은 아래와 같다.

영어로 설명된 나쁜 문제!

근데 문제는... 영어로 된 문장들이라 처음부터 난관이었다는 것... 하지만 도움을 받아 규칙성을 찾아냈다.

 

우선, 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한테 변환해달라고 부탁했다 ^___^

 

고마워 챗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언어 끝내고 파이썬 다시 봐야겠다 ^________________^

728x90
반응형
LIST

'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