강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

RokiePlayer님의 프로필 이미지
RokiePlayer

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1629_곱셈 문제의도 질문

작성

·

278

0

오버플로우 안 발생시키려고 unsigned long long을 선언했고

10의 0승부터 m승까지 하나씩 더해서 나머지 연산자 쓰는 것과 같은 논리로

숫자의 크기에 무관하도록 string 클래스에 의존해서 1씩 추가했습니다.

그렇게 해서 stoi가 있으니 stoull이 있을 거 같아서 사용해보니

긱스포긱스 ide에 써보니 정답이 나오더라고요.

근데 백준에서는 런타임 out of range가 뜨더라고요.

제 코드의 문제를 모르겠습니다.

 

 

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

 

 

 

int main(){

ios_base::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

ull a;

 

string s ="";

while(cin>>a){

s.clear();

while(1){

s.append("1");

if(stoull(s)%a==0) break;

}

cout << s.size() << endl;

}

return 0;

}

답변 1

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. RokiePlayer님ㅎㅎ

 

문제는 10의 몇승의 나머지를 뽑는 것이 아닙니다. 2의 몇승이 될 수도 있어요. 그래서 해당 코드는 아예 틀린 것이죠.

 

 

1. 그렇다고 해서 이게 10의 몇승의 나머지를 풀 수 있는 코드냐. 그런 것도 아닙니다. 이 문제의 범위를 볼까요? 무척 큰수가 나옵니다.

A가 10이고 B가 20만이라고 해봅시다. 이게 unsigned long long 으로 변환해서 나머지연산을 할 수 있는 수 인가요?

 

2. 이건 devc++에서도 out of range가 뜹니다. 만약 자신이 어떠한 로직을 작성했고 이게 틀릴 경우에는 "작은 수"를 기반으로 테스팅을 먼저 해야 합니다. 

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

int main()
{

   ios_base::sync_with_stdio(false);

   cin.tie(0);

   cout.tie(0);

   ull a;

   string s = "";
   for(int i = 0; i < 3; i++){
      cin >> a;
      s = "";
      int cnt = 0;
      while (cnt++ <= 8)
      {

         s += "1";
         cout << s << '\n';  
         if (stoi(s) % a == 0)break;
      }
      cout << s.size() << endl;
   }

   return 0;
}
/*
10 2 3
1
11
111
1111
11111
111111
1111111
11111111
111111111
9
1
11
111
1111
11111
111111
1111111
11111111
111111111
9
1
11
111
3
*/

제가 해당코드를 디버깅하기 위해서 몇개 코드를 고쳐봤는데요. 참고하시기 바립니다

 

 

또 질문사항있으시면 언제든 말씀 부탁드립니다. 

감사합니다. 

강사 큰돌 올림. 

RokiePlayer님의 프로필 이미지
RokiePlayer

작성한 질문수

질문하기