공부 기록

C++ 백준 1110번/1929번

by 너나나

1929번만 블로그에 올리려다가 1110번 처음 제출했을 때 틀려서 1110번도 그냥 올리기로 결정!!

쉬운 문제들은 사실 코드 올리기도 좀 머쓱머쓱한데 그래도 내가 첫 번째 제출 때 틀렸으니까!!! 올린다!!!!

 

백준 1110번 www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

문제 : 0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번 만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

#include<iostream>
using namespace std;

int main() {
	int num;
	int count = 0;
	int sum = 0;
	cin >> num;
	if (num < 10) {
		num = num * 10;
	}
	int a, b; //
	a = num / 10; // 두번째 자리
	b = num % 10; // 첫번째 자리
	while (sum != num || count == 0 ) {
		int t;
		t = (a + b)%10;
		a = b;
		b = t;
		count++;
		sum = a * 10 + b;
	}

	cout << count << '\n';
}

처음에 저기 while을 while(sum != num) 으로만 해서 틀렸다. 생각해보니까 시도횟수가 0번일때는 무조건 while문을 돌아야 되기 때문에 while (sum != num || count == 0 ) 이렇게 고쳤다!! 

 

백준 1929번 www.acmicpc.net/problem/1929

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

문제 : M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

 

이 문제는 guiyum.tistory.com/8 여기서 설명한 에라토스테네스의 체를 이용하는 문제이다.

#define MAX 10000000
#include<iostream>
using namespace std;

bool check[MAX + 1];
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	check[0] = check[1] = true; //0,1은 지운다!
	for (int i = 2; i * i <= MAX; i++) {
		if (check[i] == false) {
			for (int j = i * i; j <= MAX; j += i) {
				check[j] = true; // 소수의 배수는 지운다!
			}
		}
	}
	int a, b;
	cin >> a >> b;

	for (int i = a; i <= b; i++) {
		if (check[i] == false)
			cout << i << '\n';
	}
}

 

블로그의 정보

공부 기록

너나나

활동하기