Ones

출처: programming challenges

2나 5로 나눌 수 없는 0 이상 10,000 이하의 정수 n이 주어졌는데, n의 배수 중에는 10진수로 표기했을 때 모든 자리 숫자가 1인 것이 있다. 그러한 n의 배수 중에서 가장 작은 것은 몇 자리 수일까?

Sample Input

3
7
9901

Sample Output

3
6
12
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

63개의 풀이가 있습니다. 1 / 7 Page

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void main() {
    double n = 9901;
    double temp = 1;
    int i = 0;
    while(i<13) {
        i++;
        if(0==fmod(temp,n))
            break;
        temp = temp * 10 +1;
    }
    printf("%d", i+1);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class Ones {
    public static void main(String[] args){
        int n=9901;
        int res=1;
        String ones=new String("1");

        while(Long.parseLong(ones) % n != 0){
            ones=ones.concat("1");
            res+=1;
        }
        System.out.println(res);
    }
}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

매트랩으로 도전하였습니다. 111은 3의 배수, 111111은 7의 배수이므로 자연수 n을 입력 받았을때 1부터 11, 111, 1111 계속 계산하여 찾는 방식으로 구하였습니다.

n = input('# 3) Input number :');
[exp x] = deal(1);
for i = 1 : 10^5
    if (mod(n, 2)==0) || (mod(n, 5)==0)  % 2 or 5의 배수를 입력받으면 다시 입력
        n = input('Input number :');
        continue
    elseif mod(x, n) == 0
        break
    end
    x = x + 10^exp;   % ex) 111 = 11 + 100
    exp = exp + 1;
end
disp(i)
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
nums,result = [3,7,9901],0
for x in nums:
    while str(result).count('1') != len(str(result)):
        result += x
    print(len(str(result)))
    result = 0

#### 2016.12.16 D-433 ####

좀더 간략화하는 방법없을까 했는데... 이런 아예 생각을 바꾸면됫었군요! (모든자리수가 1로채워진 수) % n == 0 흠.. 역시 문제하나하나 깊게 생각하는 시간은 필수인것같습니다!ㅎ

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def num(n):
    a = 1
    while True:
        if str(n*a) == "1" * len(list(str(n*a))) :
            return len(list(str(n*a)))
            break
        else : a+=1


※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
in_ = [3,7,9901]
for i in in_:
    v = i
    while len(str(v)) != str(v).count('1'):
        v+=i
    print(len(str(v)))


무식하게 풀었는데 다른분의 풀이를 보고 역으로 생각하니 빠르고 좋네요 다시 작성했습니다.

in_ = [3,7,9901]

for i in in_:
    b = '1'
    while int(b) % i != 0:
        b+='1'
    print (len(b))

Python 3.5.2에서 작성하였습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
Func<ulong, ulong> getOnesSize = (mod) => Enumerable.Range(1, 19).Select(k => Convert.ToUInt64(new string('1', k))).Where(k => k % mod == 0).FirstOrDefault();
ulong value = getOnesSize(9901);
Console.WriteLine(value > 0 ? value.ToString().Length : -1);
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class Ones {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int max = 10000;
        int ans;

        for (int i = 0; i <= max; i++) {
            if (i%2 != 0 && i%5 != 0) {
                for (int j = 1; ; j++) {
                    ans = countAllOnes(i*j);
                    if(ans != 0){
                        System.out.println("ans : " + i + ", "+ ans);
                        break;
                    }
                }
            }
        }
    }

    private static int countAllOnes(int val){
        int count = 0;

        do {
            if (val % 10 == 1) {
                val /= 10;
                count++;
            }else {
                return 0;
            }
        } while (val > 0);

        return count;
    }

}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬 코드입니다. 처음엔 1로 이루어진 수들의 리스트로 후보들을 만들고, 그안에서 찾아내는 방식으로 코딩을 했습니다.

n = int(input())

candi = [int((10**x-1)/9) for x in range(1,21)]

for i in range(len(candi)):
    if candi[i]%n == 0:
        print(i+1)
        break

그다음에는 따로 후보를 만들 것 없이 한줄로 처리해봤습니다.

n = int(input())

i = 1
while True:
    if int((10**i-1)/9)%n == 0:
        print(i)
        break
    i += 1

파이썬 초보입니다. 많은 피드백 부탁드립니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def 배수(input_a):
    a,b=1,1
    while 1:
        if a%input_a == 0:
            return print(str(a).count("1"))
        a=a+10**b
        b+=1
배수(3)
배수(7)
배수(9901)

Python 3.5.2

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 63
java x 11
scala x 2
python x 37
cpp x 1
기 타 x 6
matlab x 1
cs x 3
php x 1
ruby x 1