제로 배당


28

도전 설명

모든 양의 정수에 n대해, 그 형태를 갖는 111...10...000수, n즉 모든로 시작하고 모든로 1끝나는 10 진수 가 존재한다 0. 이것은 증명하기가 매우 쉽습니다. 만약 우리 n+1111...111(모두) 의 형태 로 다른 수 의 집합을 취한다면 1, 적어도 두 개는 n(비둘기 구멍 원리에 따라) 나눈 후 같은 나머지를 줄 것입니다 . 이 두 숫자의 차이는 나눌 수 n있으며 원하는 형식을 갖습니다. 이 번호를 찾는 프로그램을 작성하는 것이 목표입니다.

입력 설명

양의 정수

출력 설명

와 같은 p형태의 숫자 . 둘 이상을 찾으면 그중 하나를 표시하십시오 (가장 작은 것은 필요하지 않음).111...10...000p ≡ 0 (mod n)

노트

귀하의 프로그램은 적절한 시간 내에 답변을 제공해야합니다. 이는 무차별 대입이 허용되지 않음을 의미합니다.

p = 0
while (p != 11..10.00 and p % n != 0)
    p++

이것도 아닙니다 :

do
    p = random_int()
while (p != 11..10.00 and p % n != 0)

형태로 숫자를 반복하는 11..10..00것이 허용됩니다.

프로그램은 임의로 큰 입력을 처리 할 필요가 없습니다. 상한은 언어의 상한입니다.

샘플 출력

2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110

가능한 출력에 대한 합리적인 상한선을 가질 수 있습니까? (일부 구현에는 배열 또는 목록이 필요할 수 있으므로 약 24 억 미만 (
약정

@ MartinBüttner 첫 번째 만족스러운 출력이 충분해야한다고 생각합니다 (합리적인 기간 제한)
Tamoghna Chowdhury

49 개의 테스트 사례에서 마지막 0은 필요하지 않습니다.
CalculatorFeline

@ CatsAreFluffy 나는 모든 숫자가 1적어도 하나 이상을 포함해야한다고 생각합니다 0. 그렇지 않으면 0모든 입력에 대한 솔루션입니다. (그러나 이것을 명확히하는 것이 좋을 것입니다.)
Martin Ender

하나만 1있으면 작동합니다.
CalculatorFeline

답변:


22

매스 매 티카, 29 바이트

⌊10^(9EulerPhi@#)/9⌋10^#&

Martin Büttner의 코드 .

입력에서 n,이 수와 출력 9*ϕ(n)하였다 것들 n제로, ϕ은 IS 오일러 totient 기능 . 함수를 사용하면 phi파이썬에서 다음과 같이 표현할 수 있습니다.

lambda n:'1'*9*phi(n)+'0'*n

n!대신 계승을 사용하는 ϕ(n)것만으로도 충분 하지만, 많은 사람들이 합리적인 런타임을 가지고 있지 않다는 것을 인쇄합니다.

클레임 : 9*ϕ(n) 1과 n0은의 배수입니다 n.

증명 : 먼저,하자의 사건이 증명 n의 배수가 아닌 2, 3또는 5. 우리는 1로 구성된 숫자가 ϕ(n)`n의 배수임을 보여줄 것입니다.

1로 이루어진 수는 k같습니다 (10^k-1)/9. 이후 n의 배수가 아닌 3,이의 배수 n만큼으로 10^k-1의 요인이다 n, 또는 동등의 경우는 10^k = 1 (mod n). 이 공식은 k하나의 수에 효과가 있다면의 배수도 가능하다는 것을 알 수 있습니다 k.

대한 그래서 우리는 찾고 k의 배수 여야하는 순서k에서 곱셈 그룹 모듈로 n . 으로 라그랑주의 정리 , 이러한 순서는 그룹의 크기의 약수이다. 그룹의 요소로부터 수 있기 때문에 1n이가 서로 소 n, 그 크기가 인 오일러 totient 기능 ϕ(n) . 그래서 우리는 이것을 보여주었습니다. 10^ϕ(n) = 1 (mod n)그래서 하나의 숫자는 ϕ(n)`n의 배수입니다.

자, 잠재적 요인을 처리 할 수 3있는가 n. 우리는 그것이 10^ϕ(n)-1배수 인 것을 알고 n있지만 (10^ϕ(n)-1)/9그렇지 않을 수도 있습니다. 그러나 (10^(9*ϕ(n))-1)/9배수는 1 9로 구성 9*ϕ(n)되므로 숫자의 합은의 배수입니다 9. 그리고 우리는 지수 k에 상수 를 곱 하면 분 산성을 유지합니다.

이제의 n요소와 2의 요소가 5있는 경우 출력 끝에 0을 추가해야합니다. 그것은 n실제로 0 을 사용하기에 충분합니다 log_2(n). 우리의 입력한다면, n로 분할되어 n = 2^a * 5^b * m, 그것을 가지고 충분 9*ϕ(m)의 배수가 될 것 n곱한 10^n의 배수하기를 2^a * 5^b. 그리고 이후, n의 배수이며 m, 그것은 사용하기에 충분 9*ϕ(n)것들. 따라서 9*ϕ(n)1과 n0 을 갖도록 작동합니다 .


12
아무도 내 허락없이 이것이 게시되었다고 생각하지 않도록 xnor는 메소드와 자체적으로 모든 것을 증명했으며, 내장 EulerPhi함수 가 있기 때문에 Mathematica 구현을 제공했습니다 . 실제 구현에는 전혀 신경 쓰지 않으므로이 작업을 완전히 자신의 것으로 간주합니다.
Martin Ender

9

파이썬 2, 44 바이트

f=lambda n,j=1:j/9*j*(j/9*j%n<1)or f(n,j*10)

하면 j(10) 등의 1000의 힘을 상기 바닥 부문 j/9(111)과 같이 하나의 만들어진 번호를 부여 j/9*j111,000 0 등의 동일한 수의 다음의 (1)을 제공한다.

이 함수는이 형식의 숫자를 재귀 적으로 테스트하여 원하는 숫자의 배수를 찾을 때까지 10의 거듭 제곱을 시도합니다.


1
오, 좋은 지적이다, 우리는 단지 1 ^ n0 ^ n 만 점검하면된다.
Martin Ender

@ MartinBüttner 더 쉬운 경우 0의 숫자를 입력 값으로 수정하면 충분합니다. 그래도 많은 0을 인쇄하는 것이 효율적인지 알 수 없습니다.
xnor

1 ^ n0 ^ n 점검이 작동하는 이유는 무엇입니까?
Lynn

5
@Lynn 더 많은 0을 추가해도 해를 끼치 지 않으며 가능한 많은 수의 1이 있으며 일부 숫자는 1과 0으로 충분합니다.
xnor

5

Pyth, 11 바이트

.W%HQsjZ`TT

테스트 스위트

기본적으로 숫자를 입력으로 나눌 수있을 때까지 1을 앞에 놓고 0을 계속 반복하여 넣습니다.

설명:

.W%HQsjZ`TT
                Implicit: Q = eval(input()), T = 10
.W              while loop:
  %HQ           while the current value mod Q is not zero
      jZ`T      Join the string "10" with the current value as the separator.
     s          Convert that to an integer.
          T     Starting value 10.

4

하스켈, 51 바이트

\k->[b|a<-[1..],b<-[div(10^a)9*10^a],b`mod`k<1]!!0

xnor의 접근 방식을 사용합니다. 니미는 바이트를 저장했습니다!


3

CJam, 28 25 19 바이트

xnor의 관찰로 6 바이트를 절약하여 형식의 숫자 만 볼 필요가 있습니다.1n0n

ri:X,:)Asfe*{iX%!}=

여기에서 테스트하십시오.

설명

ri:X    e# Read input, convert to integer, store in X.
,:)     e# Get range [1 ... X].
As      e# Push "10". 
fe*     e# For each N in the range, repeat the characters in "10" that many times,
        e# so we get ["10" "1100" "111000" ...].
{iX%!}= e# Select the first element from the list which is divided by X.

2

Mathematica, 140 55 바이트

NestWhile["1"<>#<>"0"&,"1",FromDigits@#~Mod~x>0&/.x->#]

xnor의 1 ^ n0 ^ n 트릭 덕분에 많은 바이트가 제거되었습니다.

최소값, 140 156 바이트 가능한 가장 작은 솔루션을 제공합니다.

NestWhile["1"<>#&,ToString[10^(Length@NestWhileList[If[EvenQ@#,If[10~Mod~#>0,#/2,#/10],#/5]&,#,Divisors@#~ContainsAny~{2, 5}&],FromDigits@#~Mod~m>0&/.m->#]&

필요한 제로 수를 1계산 한 다음 작동 할 때까지 가능한 모든 카운트 를 확인 합니다. 0이없는 숫자를 출력 할 수 있지만 <>"0"final 바로 앞에 오른쪽 을 추가하여 수정할 수 있습니다 &.


2

하스켈, 37 바이트

f n=[d|d<-"10",i<-[1..n*9],gcd n i<2]

이것은 오일러가 참을성있는 기능 을 갖는 것을 사용 한다는 사실 을 사용합니다 . 여기서, 사용하여 구현있어 각 값에 대해 하나의 숫자 생성 및 필터링 범위가 그것이 비교적 소수의 및 . 또한이 많은 0을 사용하면 충분합니다.9*phi(n)phigcdi19*n


2

자바 스크립트 (ES6), 65 바이트

thx @Neil으로 저장된 2 바이트 편집

유효 숫자 17 자리로 자바 스크립트 숫자 유형의 제한 내에서 작동합니다. (아주 제한적)

a=>{for(n='';!(m=n+=1)[17];)for(;!(m+=0)[17];)if(!(m%a))return+m}  

덜 골프

function (a) {
    for (n = ''; !(m = n += '1')[17]; )
        for (; !(m += '0')[17]; )
            if (!(m % a))
                 return +m;
}

1
왜 안돼 for(m=n;?
Neil

@Neil은 적어도 하나의 0이 필요하기 때문입니다. 어쩌면 나는 더 짧은 길을 찾을 수 있습니다 ... (편집을위한 thx)
edc65

아, 그것은 분명하지 않지만 샘플 출력은 모두 적어도 하나의 0을 가지고 있음을 알았습니다. 이 경우 여전히을 사용하여 바이트를 저장할 수 있습니다 for(m=n;!m[16];)if(!((m+=0)%a)).
Neil

1
@Neil 또는 2 바이트 Thx
edc65

1

펄 5, 26 바이트

-n( -M5.01무료)에 대한 바이트를 포함

($.="1$.0")%$_?redo:say$.


0

bc, 58 바이트

define f(n){for(x=1;m=10^x/9*10^x;++x)if(m%n==0)return m;}

샘플 결과

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000

0

dc, 27 바이트

Odsm[O*lmdO*sm+O*dln%0<f]sf

f변수에서 인수를 기대 하는 함수 를 정의 합니다 n. 프로그램으로 사용하려면 ?sn lfx pstdin에서 읽고 함수를 호출하고 결과를 stdout에 인쇄하십시오. 재사용 할 수 있으 m려면 변수 및 스택 상단을 10으로 재설정 (을 반복하여 Odsm)해야 f합니다.

결과 :

200: 111000
201: 111111111111111111111111111111111000000000000000000000000000000000
202: 11110000
203: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000
204: 111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000
205: 1111100000
206: 11111111111111111111111111111111110000000000000000000000000000000000
207: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
208: 111111000000
209: 111111111111111111000000000000000000
210: 111111000000
211: 111111111111111111111111111111000000000000000000000000000000
212: 11111111111110000000000000
213: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
214: 1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000
215: 111111111111111111111000000000000000000000
216: 111111111111111111111111111000000000000000000000000000
217: 111111111111111111111111111111000000000000000000000000000000
218: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
219: 111111111111111111111111000000000000000000000000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.