Ones

출처: programming challenges

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

Sample Input

3
7
9901

Sample Output

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

13개의 풀이가 있습니다. 1 / 2 Page

Algorithm:
(N=1부터 시작해서, 1씩 증가시킴)
입력된 수를 1로만 구성된 N개 자리의 수로 나누는 걸, 나누어질 때까지 반복합니다
package h_Ones;
import java.util.Scanner;
public class Ones {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int L=30;//입력값 수 제한
        int l,i,j,N; long n;
        long input[]=new long[L];
        System.out.println("To stop inputting, input 0.");
        for(l=0;l<L;l++){ input[l]=in.nextLong(); if(input[l]==0) break;} //입력
        for(i=0;i<l;i++){

            /*Algorithm*/
            N=-1;
            do{
                N++;
                n=1; for(j=1;j<N;j++) n=n*10+1; //n= 1로만 이루어진 N자리의 수
            }while(n%input[i]!=0);
            System.out.print(N+" ");
            /*Algorithm ends*/

        } System.out.println("  end. l:"+l);
}}

# 입출력예시
To stop inputting, input 0.
3 7 9901 21 53 47 91 1 111 31 0
3 6 12 6 13 58 6 0 3 15   end. l:10
  • 어떤 수는 연산이 너무 오래걸리거나 작동을 멈춥니다. 9999,9997 등을 입력했더니 프로그램이 작동을 멈춥니다. 다른 알고리즘을 더생각해봐야겠네요
항상 숫자 "1"로 표시되는 수로 수렴하는 것은 아닐 것 같습니다. 9999 같은 경우는 답이 없을수도... - 길가의풀, 2014/03/14 10:14 M D
아.. 다시 해보니 9999는 36, 9997은 192가 나오네요.. 멈추는 이유는 데이터 사이즈 초과 때문이 아닐까요? - 길가의풀, 2014/03/14 11:07 M D
@길가의풀 님 java의 long값의 데이터 용량을 넘겨서 그런가요? 파이썬은 java와 데이터용량체계가 다른가요?;;ㅋㅋ - Katherine, 2014/03/15 15:45 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class Ones {
    public static long ones( int number ) {
        int value = 1;
        int n = 1;
        int numberOfOne = 1;

        while( n % number != 0) {
            value *= 10;
            n += value % number;
            ++numberOfOne;
        }   
        return numberOfOne;
    }
    public static void main(String[] args) {
        System.out.println(ones(7));
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Java로 작성하였습니다.

import java.util.Scanner;

public class Ones {
    public static void main(String[] args) {

        String input;
        Scanner scan = new Scanner(System.in);

        System.out.print("input number");
        input = scan.nextLine(); 

        System.out.print(check(Long.parseLong(input)));
    }

    public static int check(long input) {
        int i = 0;
        int j = 1;
        long k = input;

        while(k!=0) {   
            if(k%10 == 1) {
                k = (k-1)/10;
                i++;
            }
            else {
                i = 0;
                j++;
                k = input * j;
            }
        }

        return i;
    }
}

2.

import java.util.Scanner;

public class Ones2 {
    public static void main(String[] args) {

        String input;
        Scanner scan = new Scanner(System.in);

        System.out.print("input number");
        input = scan.nextLine(); 

        System.out.print(check(Long.parseLong(input)));
    }

    public static int check(long input) {

        int i = 1;

        for(i = 1 ; ; i++)
        {
            if(makeOne(i) % input == 0)
                break;
        }

        return i;
    }

    public static long makeOne(int input) {

        long result=0;

        for(int i = 0 ; i<input ; i++)
            result += Math.pow(10, i);

        return result;
    }
}

/ 두가지 방식으로 작성해보았습니다. 첫번째는 input을 계속 곱해나가면서 10으로 나눌시 1의 나머지가 계속해서 생기는지 확인하는 방식이고 두번째는 반대로 1, 11, 111 순으로 나열해나가면서 각 수가 input의 배수인지 확인하는 방식입니다. /

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
public class One{
    public static void main(String[] args){
        int n = 3;
        long max = Long.MAX_VALUE;
        if(n > 0 && n < 10000) {
            if(n % 2 != 0 && n % 5 != 0){
                int count = countMultiple(n, max);  
                System.out.println(count);
            }else{
                System.out.println("2의 배수 혹은 5의 배수가 아닌 정수만 입력해주세요.");
            }
        }else{
            System.out.println("0보다 크거나 10,000보다 작은 정수만 입력해주세요.");
        }
    }

    public static int countMultiple(int n, long max) {
        int count = 1; 
        boolean flag = true;  
        if(n <= 0) return count = 0; 
        String multipleNumber = ""; 
        for(int i=n; i<=max && flag == true; i+=n){
            count = 1;
            flag = true;
            int temp = i;
                       while(true){
                if((temp - 1) % 10 == 0){
                    if(temp == 1){
                        flag = false;
                        break;
                    }else{
                        temp = (temp - 1) / 10;                 
                    }
                count ++;
                }else{
                    break;  
                 }
            }
            if(!flag){
                return count;
            }
        } 
        return 0;
    }
}
@길가의풀 앗 템플릿 고쳐주셔셔 감사합니다 ㅎㅎ - 전 수현, 2014/08/02 23:55 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

// java

    public static int ones(int n) {
        BigInteger allOnes = BigInteger.ONE;
        BigInteger bigN = BigInteger.valueOf(n);
        BigInteger ten = BigInteger.valueOf(10);

        while(true) {
            if(allOnes.mod(bigN).compareTo(BigInteger.ZERO) == 0)
                return allOnes.toString().length();
            allOnes=allOnes.multiply(ten).add(BigInteger.ONE);
        }
    }

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

역으로 생각해서 11, 111, 1111을 입력된 숫자로 나눠서 찾는 방식을 취했습니다. 아마 속도면에선 이쪽이 압도적으로 빠를겁니다. BigInteger를 써서 코드가 심플해졌네요.

public class Answer
{
    public static void main(String[] args)
    {
        try
        {
            DataInputStream in = new DataInputStream(System.in);
            BigInteger org_num = new BigInteger(in.readLine());

            for (String str = "11"; str.length() <= 100; str += "1")
            {
                BigInteger number = new BigInteger(str);
                if (number.remainder(org_num)== BigInteger.ZERO)
                {
                    System.out.print(number);
                    return;
                }
            }

            System.out.print("cannot find");
        }
        catch (Exception e)
        {

        }
    }
}

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

1, 11, 111...로 n값을 나눈 나머지로 계산하는 방식으로 짜봤습니다. 그런데해당 long 값 범위를 초과하는 경우가 생겨 답이 안나오는 경우가 있네요.(ex:9999) 혹 자바 코드로 다른 답변 아시는분 계시나요?? 아니면 9999 답이라두...

package my_test;

import java.util.Scanner;

public class Aa {

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        System.out.print("0~10000 사이 수 입력(2의배수,5의배수x):");
        int n= Integer.parseInt(scan.nextLine());

        if(n%2==0||n%5==0){
            System.out.println("잘못된 숫자 입력");
        }else{
            System.out.println("결과:"+t(n));
        }

    }

    public static int t(int su){
        int ct=1;//자리수 카운트
        long temp=1;// 1,11,111,1111
        while(!(temp%su==0)){
            ct++;
            temp=temp*10+1;
        }
        return ct;
    }

}

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
int solution(int n) {
        int result = n;
        int digit;

        while(!isAll1(result)) {
            result += n;
            System.out.println(result);

        }
        digit = countDigit(result);

        return digit;
    }

    private boolean isAll1(int n) {
        while(n >= 1) {
            if(n % 10 == 1) {
                n = n / 10;
            }
            else {
                return false;
            }
        }
        return true;
    }

    private int countDigit(int n) {
        int count = 0;

        while(n > 0) {
            n = n / 10; 
            count++;
        }
        return count;
    }
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

너무 막 짜서 부끄럽지만, 다른 분들 코드 보면서 공부 해야겠네요!

public class Ones {

    public long getOnes(long num){
        if(num % 2 == 0 || num % 5 ==0 || num > 10000 )
            return 0;
        int i = 2;
        long result = 0 ;
        while(true){
            result = num * i;
            i++;
            if(checkOnes(result))
            {
                System.out.println(result);
                break;
            }
        }
        return (result+"").length();


    }
    public boolean checkOnes(long num){

        String result = num +"";
        char check[] = result.toCharArray();
        for(int i =  0 ; i< check.length ;i++){
            if(check[i] !='1')
                return false;
        }

        return true;
    }

}

2016/04/13 15:15

xeo

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
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;
    }

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

풀이 작성

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

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


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