Bir sıfır temettü


28

Meydan açıklaması

Her pozitif tamsayı için n, formunu 111...10...000bölünebilen bir sayı vardır , nyani hepsiyle başlayan 1ve hepsiyle biten bir ondalık sayı 0. Bunu kanıtlamak çok kolaydır: şeklinde bir dizi n+1farklı sayı alırsak 111...111(tümü 1'), o zaman en az ikisi, bölünmeden sonra n(güvercin deliği ilkesine göre) aynı kalanı verecektir . Bu iki sayının farkı bölünebilir nve istenen forma sahip olacaktır. Amacınız bu numarayı bulan bir program yazmak.

Giriş açıklaması

Olumlu bir tamsayı.

Çıktı açıklaması

Bir dizi pşeklinde 111...10...000, öyle ki p ≡ 0 (mod n). Birden fazla bulursanız - bunlardan herhangi birini görüntüleyin (en küçük olması gerekmez).

notlar

Programınız cevabı makul bir süre içinde vermek zorundadır. Bu, kaba kuvvet uygulamasına izin verilmeyeceği anlamına gelir:

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

Bu da:

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

Şeklinde sayıları yineleme 11..10..00izin verilir.

Programınızın isteğe bağlı olarak büyük bir girdiyi işlemesi gerekmez - üst sınır, dilinizin üst sınırı ne olursa olsun.

Örnek çıktılar

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

Olası çıktıya makul bir üst sınır alabilir miyiz? (Bazı uygulamalar için diziler veya listeler gerekli olabileceğinden, 2.4 milyardan az bir şey (yaklaşık olarak işaretli bir tamsayı değerinin maksimum değeri) iyi olmalıdır)
Tamoghna Chowdhury

@ MartinBüttner İlk tatmin edici çıkışın yeterli olması gerektiğini düşünüyorum (makul zaman dilimi kısıtı)
Tamoghna Chowdhury

49 test durumunda son 0 gerekli değildir.
Hesap MakinesiFeline

@CatsAreFluffy Tüm numaraların en az 1ve en az bir tane içermesi gerektiğini düşünüyorum 0, aksi takdirde 0herhangi bir girdi için bir çözümdür. (Bunu açıklığa kavuşturmak iyi olurdu.)
Martin Ender

Sadece bir kişi 1çalışmalı.
Hesap MakinesiFeline

Yanıtlar:


22

Mathematica, 29 bayt

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

Martin Büttner kodu .

Giriş üzerinde n, bu numarayı çıktılar 9*ϕ(n), ardından olanlar nsıfır, ϕbir Euler totient fonksiyonu . Bir fonksiyonla phi, bu Python'da şu şekilde ifade edilebilir:

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

Faktörün kullanılması n!yerine yeterli olacaktır ϕ(n), ancak çoğu kişinin makul bir çalışma süresi olmadığını söylemek yeterli olacaktır .

Talep: Sıfırları 9*ϕ(n)takip edenler bir nçarpıdır n.

Kanıt: Birincisi, let davası için bu kanıtlamak nbir katı değil 2, 3ya 5. Bunlardan oluşan sayının ϕ(n)`n 'katları olduğunu göstereceğiz .

Bunlardan yapılan sayı keşittir (10^k-1)/9. Bunun nbir katı olmadığı için 3, bu bir faktör nolduğu sürece 10^k-1bir çarpımıdır nya da eğer eşdeğerse 10^k = 1 (mod n). Bu formülasyonun, bir ktanesinin sayısı için işe yararsa, o zaman herhangi birinin katları için de geçerli olduğunu açıkça belirtiniz k.

Yani, biz arıyoruz kkatları olmak üzere bir kde çarpımsal grup modülo n . Tarafından Lagrange teoremi , böyle bir düzen grubunun büyüklüğü bir bölen bir. Grubun elemanlarının sayı olduğu 1için nbu nispeten büyük asal olan n, boyutu olan Euler totient fonksiyonu ϕ(n) . Böylece, bunu gösterdik 10^ϕ(n) = 1 (mod n)ve ϕ(n)bunlardan yapılanların sayısı n'nin bir katıdır.

Şimdi, 3içinde potansiyel faktörleri ele alalım n. Bunun 10^ϕ(n)-1bir katı olduğunu biliyoruz n, ancak (10^ϕ(n)-1)/9olmayabilir. Ancak, (10^(9*ϕ(n))-1)/9bir katlarıdır, 9çünkü 9*ϕ(n)bunlardan oluşur , bu nedenle rakamlarının toplamı bir katlarıdır 9. Üstelik, üssün kbir sabit ile çarpılmasının bölünebilirliği koruduğunu not ettik .

Şimdi, eğer 'nin ve ' nin nfaktörleri varsa , çıktının sonuna sıfır eklememiz gerekir. Sıfır kullanmak için fazlasıyla yeterli (aslında yapardı). Bizim girişi Yani, eğer olarak ikiye bölünmüş durumda , şey var yeterli bir katı olması olanlar ile çarpılır, bir katı olması . Ve, bir katı olduğundan , kullanımı yeterlidir . Böylece, sıfırları takip edenlere sahip olmak için çalışır .25nlog_2(n)nn = 2^a * 5^b * m9*ϕ(m)n10^n2^a * 5^bnm9*ϕ(n)9*ϕ(n)n


12
Sadece kimsenin benim iznim olmadan yayınlanmadığını düşündüğünden emin olmak için: xnor bu yöntemi buldu ve hepsini kendi başına kanıtladı ve ben de ona bir Mathematica uygulaması sağladım, çünkü yerleşik bir EulerPhiişlevi var. Gerçek uygulamaya akla gelen hiçbir şey yok, bu yüzden bunu tamamen kendi eseri olarak değerlendiriyordum.
Martin Ender

9

Python 2,44 bayt

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

j1000 gibi 10'luk bir güç olduğunda , zemin bölümü 1'lerden j/9111'e kadar bir sayı j/9*jverir. Yani, 1'leri 111000'e eşit 0'lar verir.

İşlev, bu sayının sayılarını tekrar tekrar test eder, istenen sayının katı olanını bulana kadar 10'un daha yüksek ve daha yüksek güçlerini dener.


1
Oh, iyi nokta, sadece 1 ^ n0 ^ n ... 'ı kontrol etmemiz gerekiyor ...
Martin Ender

@ MartinBüttner Daha kolaysa, 0 değerini giriş değeri olarak ayarlamak da yeterlidir. Ancak bu kadar çok sıfırı yazdırmanın etkili olduğunu mu sayıyorsunuz.
xnor

1 ^ n0 ^ n denetimi neden çalışıyor?
Lynn,

5
@Lynn Daha fazla sıfır eklemek zarar veremez ve sonsuz sayıda olası sayı vardır, bazı sayılarda hem sıfır hem de sıfır olacaktır.
xnor

5

Pyth, 11 bayt

.W%HQsjZ`TT

Test odası

Temel olarak, numara giriş tarafından bölünene kadar sadece 1'i ve 0'ı tekrar tekrar tekrar tekrar koyar.

Açıklama:

.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

Haskell, 51 bayt

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

Xnor'ın yaklaşımını kullanarak. nimi bir bayt kurtardı!


3

CJam, 28 25 19 bayt

Xnor'ın yalnızca formun sayılarına bakmamız gerektiğini gözlemlemesiyle 6 bayt kurtarıldı .1n0n

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

Burada test et.

açıklama

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 bayt

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

Birçok bayt, xnor'ın 1 ^ n0 ^ n numarası sayesinde kaldırıldı.

Minimum değer, 140 156 bayt Bu, mümkün olan en küçük çözümü sunar.

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

Kaç tane sıfır gerektiğini hesaplar ve sonra 1çalışana kadar tüm olası sayıları kontrol eder . 0 içermeyen bir sayı verebilir, ancak <>"0"finalden hemen önce bir ekleyerek sabitlenebilir &.


2

Haskell, 37 bayt

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

Bu kullanır gerçeğini ona sahip olmak çalıştığını 9*phi(n)nerede, olanları phiEuler totient fonksiyonudur. Burada, aralarında ve gcddeğerinde igöreceli olarak prime olan her değer için bir rakam üreterek, kullanarak ve filtreleyerek uygulanır . Aynı zamanda bu sıfırın kullanılması yeterlidir.19*n


2

JavaScript (ES6), 65 bayt

2 bayt düzenle kaydedildi thx @Neil

17 önemli basamaklı, javascript sayısal tip sınırları içinde çalışır. (Çok sınırlı)

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

Daha az golf oynadı

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

1
Neden olmasın for(m=n;?
Neil,

@Neil, çünkü en az bir sıfıra ihtiyacım var. Belki daha kısa bir yol bulabilirim ... (düzenleme için
teşekkürler

Oh, bu soruda net değildi, ama şimdi örnek çıktılarının en az bir sıfıra sahip olduğunu görüyorum. Bu durumda, yine de kullanarak bir bayt kaydedebilirsiniz for(m=n;!m[16];)if(!((m+=0)%a)).
Neil,

1
@Neil veya hatta 2 byte. Thx
edc65

1

Perl 5, 26 bayt

için bir bayt içerir -n( -M5.01ücretsizdir)

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


0

bc, 58 bayt

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

Örnek sonuçlar

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 bayt

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

Bu fdeğişkende argümanını bekleyen bir fonksiyon tanımlar n. Program olarak kullanmak ?sn lfx p, stdin'den okumak, fonksiyonu çağırmak ve sonucu stdout'a yazdırmak. Yeniden kullanılmadan önce değişken mve üst yığının 10'a (tekrarlanarak Odsm) sıfırlanması gerekir f.

Sonuçlar:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.