문제 링크
난이도 : 실버 3
문제 내용
2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.
출력
각 자릿수가 모두 1로만 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.
문제 분석
문자열 “1”에다가 뒤에 하나씩 1 붙이면 되지 않을까?
작성한 코드
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
string s = "1";
for(;scanf("%d", &n);printf("%s", s)){
while(true){
if(stoi(s)%n!=0) s += '1';
else break;
}
}
}
결과 : 개 큰 오류.. out of range 뜸.
찾아보니 stoi()가 문제였음
int 범위가 최대 10자리임
근데 예시 input/output에서도 보면 알겠지만 12자리 이상도 충분히 나올 수 있음 (이 생각을 못함..)
그래서 다른 방법을 써야하는 듯
아래는 deepseek가 써줌
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int num = 1; // 1로 시작
int length = 1; // 숫자의 길이
while (true) {
if (num % n == 0) { // n으로 나누어 떨어지는지 확인
printf("%d\\n", length);
break;
}
num = (num * 10 + 1) % n; // 다음 숫자로 업데이트
length++;
}
}
return 0;
}
우수 코드 분석
#include <cstdio>
void solveCase (int N) {
int k=1;
int cnt=1;
k %= N;
while (k) {
cnt++;
k = (k*10 + 1) % N;
}
printf("%d\\n", cnt);
}
int main ()
{
int N;
while (scanf("%d", &N) > 0) {
solveCase(N);
}
return 0;
}
똑같은 방식으로 진행하심
k % n == 0이면 멈추니까 while(k)로 하신듯