C++ 알고리즘 기초19 -반복문 심화3(무한루프 만들기, 비교연산자 주의할점, 반복문에서 i값 가져오기)-

1. 완전수 판별하기

 

숫자 n이 주어졌을 때, n이 완전수인지 판단하는 프로그램을 작성해보세요. 완전수란 자기 자신을 제외한 약수의 합이 자신이 되는 수를 나타냅니다. 예를 들어 6의 경우 1 + 2 + 3 = 6 이기 때문에 완전수입니다.

 

n이 1000이하니까 $O(\sqrt{n})$으로 나눠볼 필요는 없을 것 같고

 

1부터 n-1까지 n을 나눠보면서 약수라면 누적합해준 다음에

 

반복문을 탈출하고 누적합한 값이 n과 같은지 비교해보면 되겠지

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    int answer = 0;

    for(int i = 1; i < n; i++){
        if(n % i == 0){
            answer += i;
        }
    }

    if(answer == n){
        cout << "P";
    } else {
        cout << "N";
    }
    return 0;
}

 

 

2. $a^{b}$를 구하는 방법

 

a, b 두 자연수를 입력받아 $a^{b}$ 값을 출력하는 프로그램을 작성해보세요.

 

누적 곱을 구할때는 초기화 변수 answer = 1로 둬야한다.

 

반복문으로 answer에 a를 b번 곱해주면 되겠지

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int a,b;
    cin >> a >> b;
    int answer = 1;

    for(int i = 1; i <= b; i++){
        answer *= a;
    }

    cout << answer;
    return 0;
}

 

 

3. 무한루프 만들기

 

특정 조건을 만족하기 전까지는 절대 빠져나올 수 없는 루프

 

while(true)를 사용하면 조건이 항상 참이므로, 반복문을 무한히 수행

 

반복문 안에서 특정한 조건을 만족하면, break로 탈출하도록

 

다음은 n을 입력받는데, 코드 2를 계속 수행하다가, n >= 10이 된다면 코드 1을 수행하고 반복문을 탈출하고,

 

코드3을 수행

 

int n;
while (true) {
    cin >> n;
    if (n >= 10) {
        코드1
        break;
    }
    코드2
}
코드3

 

자바와는 다르게 파이썬처럼 조건식에 while(1)로 사용가능하다.

 

0(false)이 아닌 값은 조건식이 참(true)이 된다.

 

#include <iostream>
using namespace std;

int main() {

	while (1) {
		cout << "a" << endl;
	}

	return 0;

}

 

혹은 for문의 초기화, 조건, 증감식을 모두 생략하면 무한루프가 만들어진다

 

이건 자바도 마찬가지

 

#include <iostream>
using namespace std;

int main() {

	for (;;) {
		cout << "b" << endl;
	}

	return 0;

}

 

4. 'C'와 "C"는 다르다

 

사각형의 가로세로의 길이와 문자가 주어집니다. 문자 C가 주어지는 줄까지 사각형의 넓이를 구하는 프로그램을 작성해보세요.

 

char c;로 선언하고 입력을 받은데, c == 'C'로 비교하는거랑 c == "C"로 비교하는거랑 다르더라고

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int a,b;
    char c;

    while (1) {
        cin >> a >> b >> c;
        cout << a*b << endl;

        if(c == 'C'){
            break;
        }
    }
    return 0;
}

 

 c == "C"로 비교하면 에러남

 

 

 

이게 ""으로 묶으면 string으로 인식해서, c는 char인데 string이랑 비교할려하니까 에러나는것 같더라

 

string c;로 선언하고 c == "C"하면 에러가 안나더라

 

 

5. log2를 구현하기

 

2의 거듭제곱수 중 하나인 n을 입력받아, $n = 2^{x}$ 를 만족하는 x 값을 구하는 코드를 작성해보세요.

 

x = 0으로 초기화하고, 2를 누적곱하면서 x를 증가시킨 다음에 누적곱이 n과 같다면 반복문 탈출하고

 

x를 출력하면 되겠지

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    int product = 1;
    int x = 0;

    while(1) {

        product *= 2;
        x += 1;
        if(product == n){
            break;
        }

    }
    cout << x;
    return 0;
}

 

6. 공약수가 존재하는지 판단하기

 

정수 a, b가 주어지면, a이상 b이하의 수 중에서 1,920과 2,880의 공약수가 존재하는지 판단해보는 프로그램을 작성해보세요.

 

a부터 b까지 순회해서 그것을 i라고 한다면, 1920과 2880이 모두 i로 나누어 떨어진다면 i가 1920,2880의 공약수가 된다.

 

그러한 공약수가 존재한다면 flag를 true로 바꾸고 반복문을 바로 탈출하자

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int a,b;
    cin >> a >> b;

    bool answer = false;

    for(int i = a; i <= b; i++){

        if (1920 % i == 0 && 2880 % i == 0){
            answer = true;
            break;
        }
    }

    if(answer == true){
        cout << 1;
    } else {
        cout << 0;
    }
    return 0;
}

 

7. 소수 판단하기

 

소수는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수입니다. 숫자 n이 주어졌을 때, n이 소수인지 판단하는 프로그램을 작성해보세요.

 

2부터 n-1까지 순회해서 그것을 i라고 한다면 n이 i로 나누어 떨어진다면 n은 소수가 아니고,

 

한번도 나누어 떨어지지 않는다면 n은 소수이다.

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    bool prime = true;

    for(int i = 2; i <= n-1; i++){
        if(n % i == 0){
            prime = false;
            break;
        }
    }

    if(prime == true){
        cout << "P";
    } else {
        cout << "C";
    }
    return 0;
}

 

 

8. 반복문에서 i값 가져오기

 

for문에서 돈 int i = 0 이 i 값을 가져오고 싶을 때가 있는데, 다음과 같이 작성하면,

 

int a = 0;

for(int i = 0; i < 10; i++){
    
    a += 1;
}

cout << i;

 

다음과 같이 선언도 안된 식별자라고 나옴

 

 

다음과 같이 int i = 0;으로 초기화하고.. 실행해보면..?

 

#include <iostream>
using namespace std;

int main() {

	int a = 0;

	int i = 0;

	for (int i = 0; i < 10; i++) {
		a += 1;
	}

	cout << i;

	return 0;
}

 

i = 10이 나오길 기대하는데 실제로는 i = 0이 나옴

 

 

이번엔 다음과 같이 int i = 0;으로 밖에서 초기화하고, for문 안에는 int i = 0;으로 선언하지 않고 i = 0;으로만 한다면?

 

#include <iostream>
using namespace std;

int main() {

	int a = 0;

	int i = 0;

	for (i = 0; i < 10; i++) {
		a += 1;
	}

	cout << i;

	return 0;
}

 

그러면 내가 원하는 i = 10으로 출력됨

 

 

 

그러니까 다음과 같은 사실을 알 수 있다

 

1) for문 안에 for(int i = 0; i < 10; i++)에서 int i = 0;의 범위는 for문 안까지이고,

 

for문이 끝나면 int i = 0;은 사라진다

 

2) 밖에서 int i = 0;으로 선언하고, for문 안에서 또 int i = 0;으로 선언하면?

 

for문 안에서 int i = 0; 선언한 것과 밖에서 선언한 int i = 0;은 서로 다른 주소에 위치해서 무관한 값이 되는듯

 

3) 다시 밖에서 int i = 0;으로 선언하고, for문의 초기화식에서 i = 0;으로만 한다면?

 

밖에서 선언한 int i = 0;을 가져와서 사용해가지고 for문이 끝나도 i값이 유지되어 원하는 i = 10 값을 가져온다

 

C++ Declaring int in the for loop - Stack Overflow

 

C++ Declaring int in the for loop

Haven't used C++ in a while. I've been depending on my Java compiler to do optimization. What's is the most optimized way to do a for loop in C++? Or it is all the same now with moderm compile...

stackoverflow.com

 

TAGS.

Comments