一零分红


28

挑战说明

对于每个正整数n,存在一个其形式111...10...000可被n整数整除的数字,即以all开头并以all 1结尾的十进制数0。这很容易证明:如果我们采用(全)n+1形式的一组不同数字,那么除以后(根据信鸽原理),至少其中两个将给出相同的余数。这两个数字的差可以被期望的形式整除。您的目标是编写一个找到该数字的程序。111...1111nn

输入说明

一个正整数。

输出说明

许多p的形式111...10...000,使得p ≡ 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亿(有符号整数的最大值)的东西应该可以,因为某些实现可能需要数组或列表)
Tamoghna Chowdhury

@MartinBüttner我认为第一个令人满意的输出应该就足够了(合理的时间框架约束)
Tamoghna Chowdhury 16/02/28

在49个测试用例中,最后一个0是不必要的。
CalculatorFeline

@CatsAreFluffy我认为所有数字都必须包含1至少一个0,至少一个,否则0是任何输入的解决方案。(尽管可以澄清这一点。)
马丁·恩德

只需要一个就1可以了。
CalculatorFeline

Answers:


22

Mathematica,29个字节

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

MartinBüttner编写的代码。

在输入时n,这会输出带9*ϕ(n)1 的数字,后跟n零,这ϕEuler上位函数。使用函数phi可以用Python表示为

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

使用阶乘n!代替,就足够了ϕ(n),但是打印出许多阶乘并没有合理的运行时间。

声明: 9*ϕ(n) 1后跟n零是的倍数n

证明:首先,让我们证明这一点对于该案件n不是的倍数235。我们将显示由ϕ(n)1 组成的数字是n的倍数。

由1组成k的数字相等(10^k-1)/9。由于n不是的倍数3,因此这是的倍数,n只要10^k-1是的倍数即可n,或者等价于10^k = 1 (mod n)。请注意,这种表述很明显,如果k对一个数有效,那么的任意倍数也是如此k

因此,我们正在寻找模n乘法组k中的k倍数。根据拉格朗日定理,任何这样的阶数都是该组大小的除数。由于该组的元素是从1到的n素数n,因此其大小就是Euler上位函数 ϕ(n)。因此,我们已经证明10^ϕ(n) = 1 (mod n),所以由1组成的数字ϕ(n)是`n的倍数。

现在,让我们处理3in中的潜在因素n。我们知道这10^ϕ(n)-1是的倍数n,但(10^ϕ(n)-1)/9可能不是。但是,(10^(9*ϕ(n))-1)/9是的倍数,9因为它由9*ϕ(n)1 组成,所以其数字的总和是的倍数9。而且我们已经注意到,将指数乘以k常数可以保留可除性。

现在,如果n有因素2的和5的,我们需要添加零结束的输出。使用n零已经足够了(实际上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)一个n零。


12
只是为了确保没有人认为未经我的许可就发布了此内容:xnor独自提出了该方法并进行了证明,而我只是向他提供了Mathematica实现,因为它具有内置EulerPhi功能。实际的实现没有什么令人费解的,因此我将充分考虑他自己的工作。
Martin Ender

9

Python 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给出的数字由1组成,例如111。因此,j/9*j给出1的后跟相等的0数量,例如111000。

该函数递归地测试这种形式的数字,并尝试使用越来越高的10的幂,直到我们找到所需数字的倍数。


1
哦,好点,我们只需要检查1 ^ n0 ^ n ...
Martin Ender

@MartinBüttner如果更简单,则只需将0的数量固定为输入值即可。但是不知道打印那么多的零是否有效。
xnor

为什么检查1 ^ n0 ^ n有效?
林恩

5
@Lynn添加更多零不会造成伤害,并且存在无限多个可能的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

Haskell,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

Haskell,37个字节

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

这利用了它具有一个事实的事实,欧拉totient函数9*phi(n)在哪里phi。在这里,它是使用gcd和过滤实现的,它i为范围1和中的每个相对底数产生一个数字9*n。使用这么多的零也足够了。


2

JavaScript(ES6),65个字节

编辑保存的2个字节thx @Neil

它在javascript数字类型的范围内有效,具有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,因为我至少需要一个零。也许我可以找到一个更短的方法...(编辑)
edc65 '16

哦,这个问题尚不清楚,但是我现在看到样本输出全部都至少有一个零。在这种情况下,您仍然可以使用来保存一个字节for(m=n;!m[16];)if(!((m+=0)%a))
尼尔

1
@Neil甚至2个字节。Thx
edc65 '16

1

Perl 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 p从stdin读取,调用函数并将结果打印到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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.