[Algorithm] 2. 자연수의 합 & 3. 진약수의 합

인트로

알고리즘 코드는 C 또는 C++ 기반으로 작성되었습니다.

 

비슷하면서도 약간 다른 문제가 기억에 남아 기록하려 한다.

생각의 틀을 조금만 바꾸면 되는 문제이다.

 

자연수의 합

문제

자연수 A, B가 주어지면 A부터 B까지의 합을 수식과 함께 출력하세요.

첫 줄에 자연수 A, B가 공백을 사이에 두고 차례대로 입력된다. (1<=A<B<=100)

첫 줄에 더하는 수식과 함께 합을 출력합니다.

입력

3 7

출력

3 + 4 + 5 + 6 + 7 = 25

코드

A부터 B까지 수를 더하는 건 정말 간단하다. 

숫자와 + 기호를 한 묶음으로 출력하면 된다. 

(3 + ) (4 +) (5 +)...

애매한 건 마지막 숫자인데 for문을 마지막 숫자 전까지만 돌리고 for문 밖에서 마지막 숫자를 출력하면 된다.

#include <iostream>

using namespace std;

int main()
{
    int a, b, res = 0;

    cin >> a >> b;

    for (int i = a; i < b; i++)
    {
        cout << i << " + ";
        res += i;
    }
    res += b;

    cout << b << " = " << res;

    return 0;
}

 

 

진약수의 합

문제

자연수 N이 주어지면 자연수 N의 진약수의 합을 수식과 함께 출력하는 프로그램을 작성하세요.

첫 줄에 자연수 N이 주어집니다. (3<N<=100)

첫 줄에 더하는 수식과 함께 합을 출력합니다.

입력

20

출력

1 + 2 + 4 + 5 + 10 = 22

코드

'자연수의 합' 문제와 비슷하다. 

for문을 돌면서 약수인지 검사하고 출력하면 된다. 

 

다만 이번엔 고민되는 부분이 있다. 

'자연수의 합' 문제처럼 (1 + ) (2 + )..처럼 묶어서 출력할 수 없다. 마지막에 출력될 약수가 무엇인지 모르기 때문이다.

따라서 마지막 약수의 출력과 for를 분리할 수 없다.

 

생각을 전환해보면 1이란 숫자는 모든 정수의 약수이다.

1을 기본적으로 출력하고 ( + 2) ( + 4) ( + 5)를 한 묶음으로 생각하고 출력하면 문제가 쉬워진다.

#include <iostream>

using namespace std;

int main()
{
    int a, res = 1;

    cin >> a;

    cout << 1;

    for (int i = 2; i < a; i++)
    {
        if (a % i == 0)
        {
            res += i;
            cout << " + " << i;
        }
    }

    cout << " = " << res;

    return 0;
}