일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 15353
- 재귀함수
- BOJ
- 재귀
- 백준
- 1로만들기2
- 15662
- C++
- 회전하는큐
- 크로스핏
- 4811
- 서울에서경산까지
- Python
- 브루트포스
- D1
- 26008
- dart
- 스택
- sw expert academy
- 삼성
- 해시해킹
- spring boot
- 그리디
- 동적프로그래밍
- 1781
- BOJ14889
- Flutter
- 14863
- DP
- Crossfit
- Today
- Total
곧죽어도 콛잉
[구현 / BOJ 4375 / C++] 1 본문
https://www.acmicpc.net/problem/4375
4375번: 1
2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.
www.acmicpc.net
문제는 간단하다. 딱 1로만 이루어진 수 ( 1, 11, 111, 1111 ......) 를 구해서 자리수만 구하면 되는 문제이다.
로직을 정리하자면,
1. for문을 통해 1, 11, 111, 1111, ... 과 같이 1로만 된 수를 구한다.
2. 만약, 주어진 n으로 나눠떨어지는 1로만 된 수가 나오면 break 한다.
3. 그 숫자의 자리수를 구해 출력한다.
이다. 그러나 이걸 직접 실행해보면 오버플로우의 지옥을 맛보게 될 것이다.
n=9999 일때를 생각해보자,,, 얼마나 많은 1이여야할까..
그래서 이렇게 무식하게 하는 방법 대신 뭔가 새로운 방법을 알아야한다.
바로 수학 공식을 이용해야한다. (모듈러 공식)
(A +B) % C = { (A%C) + (B%C) } %C
이를 이용하면 {1 % C + 10 % C + 100 % C} % C = 111 % C 로 이해할 수 있다.
즉 위의 로직을 조금 응용해서,
1. cnt= 1 로 하고, cnt = 10 * cnt + 1, cnt %= n, 를 한다. 동시에 ret 를 늘려준다.
2. 만약 cnt%n == 0 이 되면 반복을 종료하고 ret를 출력한다.
while(cin>>n) 은 입력이 종료될때까지 입력을 받는 방식이다.
모듈러 연산은 처음에는 어렵지만 익숙해지면 좀 나아질 것이다.
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
while(cin>>n){
int cnt=1, ret=1;
while(true){
if(cnt%n==0) {
cout << ret <<'\n';
break;
}else{
cnt = cnt*10 + 1;
cnt%=n;
ret++;
}
}
}
return 0;
}
'Coding Test > C++' 카테고리의 다른 글
[그래프 / BOJ 2583 / C++] 영역 구하기 (0) | 2023.02.09 |
---|---|
[그래프 / BOJ 1012 / C++] 유기농 배추 (0) | 2023.02.09 |
[구현 / BOJ 1213 / C++] 팰린드롬 만들기 (0) | 2023.02.07 |
[구현 / BOJ 2559 / C++] 수열 (0) | 2023.02.07 |
[구현 / BOJ 9375 / C++] 패션왕 신해빈 (0) | 2023.02.07 |