Rylah's Study & Daily Life

[BOJ/C++] 4375. 1 본문

BOJ/02. Mathmatics

[BOJ/C++] 4375. 1

Rylah 2022. 1. 13. 10:33

https://www.acmicpc.net/problem/4375

 

4375번: 1

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

www.acmicpc.net

문제

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.

출력

1로 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.

해결 방법

1. 처음에 문제를 이해하는 것이 어려웠다.

 조건 1. 입력에는 2와 5로 나누어 떨어지지 않는 정수 (1 ≤ n ≤ 10000)이 주어졌다. (테스트 케이스를 만들때 신경 써야 할 것)

 조건 2. 1로 이루어진 n의 배수의 의미는 숫자는 1,11,111,1111,11111..... 이렇게 늘어나는 것이고 n의 배수는 입력 받은 수의 배수인지 나눠서 검증하는 것이다. 

 

 방법. 나머지의 정리를 생각하면 ((M % N) * 10 + 1) % N 을 반복하는 방법을 이용한다. 

        그림으로 보면 다음과 같다.

 

 선이 조금 엇나갔는데 아무튼 나눌 수 n은 7로 가정하고 우리가 생각하는 수 m은 1,11,111,1111,11111로 증가한다고 생각하면 된다.

 

PREV에 * 10 + 1을 하고 계속해서 N으로 나눈 나머지에서 0이 나올때까지 검증하고 그 자리수는 count를 세어준 것과 같다.

// Code Plus BasicA
// 0x00. Math
// Written by Rylah
// Written Date : 2022.01.13
// https://minteul.tistory.com/303
// https://www.acmicpc.net/source/37480110

// 4375. 1
// m : last add 1 , maybe it's very very high num. use long long.
// n : mod number
// count : m length is count iter num

#include <bits/stdc++.h>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	
	while (cin >> n) // if is cin infinite looping
	{
		int count = 1;
		long long m = 1;
		while (m % n != 0)
		{
			m = m * 10 + 1;
			m %= n;
			count++;
		}
		cout << count << '\n';
	}
	return 0;
}

 

'BOJ > 02. Mathmatics' 카테고리의 다른 글

[BOJ/C++] 2609. 최대공약수와 최소공배수  (0) 2022.01.13
[BOJ/C++] 17425. 약수의 합  (0) 2022.01.13
[BOJ/C++] 17427. 약수의 합 2  (0) 2022.01.13
[BOJ/C++] 1037. 약수  (0) 2022.01.13
[BOJ/C++] 10430. 나머지  (0) 2022.01.12