仅使用++计算平方根


13

您的任务是计算正整数的平方根,而无需使用任何数学运算符来更改数字,例如:

  • 设置变量(例如squareRoot = 5)
  • 加法(A + B)
  • 减法(AB)
  • 乘法(A * B)
  • 部门(A / B)
  • 平方,立方,四等根
  • 指数

就此问题而言,比较运算符(例如<,>,==等)不被视为“数学运算符”,并且允许它们,只要它们不更改变量的值即可。

您唯一可以使用的运算符是++。有以下例外情况:

  • 如果需要,可以将其设置为0来初始化变量。
  • 如果您的语言不包含++语法,则可以使用等效的语法,例如foo + = 1或foo = foo + 1
  • 平方根应计算为小数点后的至少六位(十万位),并输出为小数点的整数(例如,如果我输入2,则根据四舍五入可以得出14142135624或1414213) 。向上或向下取整并不重要。

不允许使用用户定义的功能。另外,也不允许使用goto模拟功能。

我很想看看每个人都提交了什么!编码愉快!

澄清说明

说明该数字是一个正整数。欢迎您编写可以做任何数字的代码,但这不是必需的。

澄清#2

说明允许比较运算符。

澄清#3

加法,减法,乘法,除法和功能变化的数字都是不允许的所有,不管他们是否被保存到一个变量或没有。抱歉,这会使现有的几个答案无效,但是我想用“更改数字”定义这组运算符,以防止出现巨魔答案(例如,我只是使用sqrt()函数,您只禁止添加,乘法,除法和减法)。对困惑感到抱歉。

澄清#4

说明我们至少需要5位数字。10位数字导致代码长时间运行。


1
不,-不允许,对不起造成的混乱!我原本计划使用++,但是-我决定在最后一刻退出。
iggyvolz 2014年

5
“不使用任何数学运算符来更改数字” -我认为可能需要澄清。你的意思是这些运营商可能无法使用在所有的,或者,他们可以使用,但仅当结果不保存到一个变量,例如while r*r<n*10e20:r+=1-相当琐碎。另外,您可以考虑将所需的输出减少到10 ^ 8左右。首先,因为10 ^ 10大于2 ^ 31,其次,因为要花费较高的时间会花费一些时间。
primo 2014年

1
为什么你曾经想“变”在所有的任何变量?你们当之无愧的家伙有奇怪的思维方式……
不再转向反时钟了

4
我想结束这个问题。这个问题已经有了很大的改变。您实际上应该通过Sandbox验证此问题,否则您会挫败人们投入大量精力来回答这个问题的人。
阿比吉特(Abhijit)2014年

3
没有时间/内存限制,减少所需数字的位数是没有意义的。我的代码可以处理5位数字,但是我的机器没有足够的RAM。
丹尼斯2014年

Answers:


13

Python 66

print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real

输出量

>>> print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real
121
110000000000
>>> print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real
1000
316227766017

该解决方案在复杂的平面上使用Theodorus螺旋来获得结果。


2
我认为这需要包装int(...*1e10),否则非常好。虽然,采用abs复杂的值或多或少sqrt是伪装的。
primo 2014年

1
@primo我认为您不被允许*1e10...
Cruncher

@primo:我没有乘以1e10,而是采取了另一条路线。尽管我同意Abs可能是伪装的sqrt,但是我仍然认为问题中目前所说的完全合法。
Abhijit 2014年

我看到投票不足,而且很令人沮丧。我对这个答案寄予厚望,因此任何反对的人请留下评论。
阿比吉特(Abhijit)2014年

9
@iggyvolz:我很惊讶您继续扩大问题并增加更多限制。人们投入时间和精力来写答案,您不能期望他们会变得sy谐。
阿比吉特(Abhijit)2014年

6

Python,184个字符

以下Python解决方案仅使用增量运算符,而不使用其他算术运算符。但是,以所需的精度(10位数字)运行的时间不可能太长。您可以通过减少精度较低(3位)测试1e201e6

import sys;t=0
for _ in range(int(sys.argv[1])):
 for _ in range(int(1e20)):t+=1
q=0
while 1:
 z=0
 for _ in range(q):
  for _ in range(q):z+=1
 if z>=t:break
 q+=1
print(q)

取消高尔夫:

import sys

# t = N * 100000000000000000000 (magnitude of twice the precision)
t = 0
for _ in range(int(sys.argv[1])):
    for _ in range(int(1e20)):
        t += 1
q = 0
while True:
    # z = q * q
    z = 0
    for _ in range(q):
        for _ in range(q):
            z += 1
    if z >= t:
        break
    q += 1
print(q)

我澄清了这个问题,您可以将数字位数设置为任意数字(至少5位)。我不熟悉python,但我假设int()只是类型转换程序?如果是这样,那很好,因为它不会更改数字的值。
iggyvolz 2014年

@iggyvolz:正确,您需要将字符串参数值(在命令行上指定)转换为整数。一个普通的函数将不需要它。
Greg Hewgill 2014年

2

Fortran 73

read*,t;s=0;do while(abs(s*s/1e10-t)>1e-10);s=s+1;enddo;print*,s/1e5;end

可能需要花很多时间才能真正确定某些值的答案,但是可以肯定地使用。当我使用*和时-这些没有更改任何值,只有s=s+1实际更改了任何值


哇,猜想我没想到要使用运算符来更改静态值。很好,并且+1(如果我有15个声誉可以
投票

这使用了*运算符,这显然是不允许的。还是我以某种方式误解了给定的限制?
Greg Hewgill 2014年

@GregHewgill:OP状态,无需使用任何数学运算符即可更改数字;这些运算符不会更改任何值。
Kyle Kanos 2014年

7
但这仍在使用*运算符更改数字,您只是没有将结果保存在任何地方。如果OP仅想简单地禁止赋值(而不是s=s+1),那么为什么要提及所有被禁止的算术运算符?
Greg Hewgill 2014年

1
@iggyvolz:大约20小时后更改规则是不好的形式。请不要这样做,而应使用沙盒解决问题中的问题。
Kyle Kanos 2014年

2

CJam,26个字节

q~,1e20,m*,:N!{)_,_m*,N<}g

在线尝试。粘贴代码,在“ 输入中键入所需的整数,然后单击“运行”。在您这样做之前,我建议更改1e101e4

Java解释器手柄1e6,在约15秒输入“2”。1e20将需要巨大的内存量。

例子

$ cjam <(echo 'q~,1e2,m*,:N!{)_,_m*,N<}g') <<< 4; echo
20
$ cjam <(echo 'q~,1e2,m*,:N!{)_,_m*,N<}g') <<< 2; echo
15
$ cjam <(echo 'q~,1e4,m*,:N!{)_,_m*,N<}g') <<< 4; echo
200
$ cjam <(echo 'q~,1e4,m*,:N!{)_,_m*,N<}g') <<< 2; echo
142
$ cjam <(echo 'q~,1e6,m*,:N!{)_,_m*,N<}g') <<< 4; echo
2000
$ cjam <(echo 'q~,1e6,m*,:N!{)_,_m*,N<}g') <<< 2; echo
1415

背景

由于不允许数学运算符更改数字,因此将使用setwise运算符更改数组。

该代码开始于将输入(i)乘以1e20,但没有任何实际的乘积。相反,我们推入一个包含“ i”个整数的数组,一个包含1e20个整数的数组,取其笛卡尔积并计算其长度。

然后,我们推零并递增,直到整数本身(如上计算)的乘积不再小于为止i * 1e20。这导致平方根被四舍五入。

怎么运行的

q~     " Read for STDIN and interpret. ";
,      " Push an array containing that many integers. ";
1e20,  " Push the array [ 0   …   1e20 - 1]. ";
m*,:N  " Get the length of the cartesian product and save it in “N”. ";
!      " Logical NOT. Since the input is a positive integer, this pushes 0. " ;
{      " ";
  )    " Increment the integer on the stack.";
  _,   " Push an array containing that many integers. ";
  _m*, " Get the length of the cartesian product of the array by itself. ";
  N<   " If the product is smaller than the target value, push 1; otherwise push 0. ";
}g     " Repeat the loop if the result was 1. ";

1

眼镜蛇-62

在第三次修改之前发布,不再有效。

它不仅简短,而且在以下情况下也应无溢出: n < Decimal.maxValue

def f(n)
    r,e=0d,10000000000
    while r/e*r/e<n,r+=1
    print r

但是您曾经使用过r/e*r/e,这显然是非++数学运算符...
nneonneo 2014年

@nneonneo这是在第三次编辑之前发布的,我还没有对其进行更改
2014年

0

斯卡拉117

val z=BigInt(readLine+"0000000000")
print(Stream.from(1)find(x=>(BigInt(0)/:Stream.fill(x,x)(1).flatten){_+_}>=z)get)

不能在合理的时间内完成,即使输入2,也可以。您可能会注意到我在做_+_,但是只会加1,Scala仍然没有++运算符。我可以通过将内部Stream替换为List来保存两个字符,但是这样会耗尽内存。如我所写,我认为它仅在处理时间而不是内存使用方面可扩展。


0

Haskell,70个字节

s i|r<-[1..i]=foldl1(.)[(+1)|j<-r,k<-r]
f i=[j-1|j<-[0..],s j 0>=i]!!1

f通过找到平方小于或等于输入的最大数字,得出整数平方根。平方函数s i(i,i)矩阵的每个元素加一。(在电话上键入,可能会有错别字)。


0

PHP,124字节

这是一个详尽的算法。它只是尝试数字,直到该数字的平方大于“目标”数字(这是输入时间1E number of decimals平方(十进制2的结果为10.000)),然后打印最后一个数字。

for(;$a++<$z=$argv[1];)for(;$$a++<1e6;)$g++;for(;$b++<$g;$i=$x=0)for(;$i++<$b;)for($j=0;$j++<$b;)if(++$x>=$g)break 3;echo$b;

像这样运行(-d仅出于美观原因添加):

php -d error_reporting=32757 -r 'for(;$a++<$z=$argv[1];)for(;$$a++<1e6;)$g++;for(;$b++<$g;$i=$x=0)for(;$i++<$b;)for($j=0;$j++<$b;)if(++$x>=$g)break 3;echo"$b\n";' 2

不建议尝试使用小数点后3位或大于10的数字。

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.