도움!! 제곱근을하는 방법! [닫은]


42

안녕하세요 여러분, 수업 시간에 숫자 제곱근을 만들어야하지만 작동하지 않습니다!

도전 과제 :

Write a function or program that will "make a number square root". 

참고 : 이것은 코드 트롤링입니다. 이 새로운 프로그래머에게 프로그래밍 성공의 길을 안내하는 "유용한"답변을 제공하십시오! 창의력을 발휘하십시오!


63
@CloseVoters 우승 기준이 부족하여 [code-trolling] 주제를 주제로 마감하기 위해 투표를 중단하십시오. 이 경우 분명히 이것은 [인기 경연 대회]입니다. 원하는 경우 수정하십시오. [코드 추적]이 마음에 들지 않는다고해서 다른 사람의 도전을 끝내야한다는 의미는 아닙니다. 분명히, 이러한 유형의 도전을 좋아하는 많은 사람들이 답의 수로 입증되었으므로 SE는 공동체 중심의 사이트 이기 때문에이 사람들에게 공개되어 있습니다.
저스틴

12
@Quincunx 기록을 위해, 나의 투표는 너무 광범위했다. 문자 그대로 "제곱근과 관련된 것을 만드십시오"를 제외하고는 갈 것이 없습니다. (15 개의 답변이 이미있는 것으로 입증
되었음

7
마감 투표자 : 이것이 닫히지 않은 다른 [코드 추적] 질문 보다 더 "광범위한"방법을 이해하도록 도와 줄 수 있습니까 ? 여기에 유효한 근거가 있을지 모르지만 코드 트롤링 범주는 당연히 대부분의 문제보다 약간 더 넓습니다. 그렇지 않으면 목적을 다소 어길 것입니다.
Geobits

6
@Geobits는 대답이 정확할 필요는 없다고 말함으로써 "일부 코드 작성"만큼 광범위합니다.
피터 테일러

11
@Gareth 그것은 흥미로운 비유이지만 원래 의견과 일치하지 않습니다. 하루 종일 맥도날드 밖에 서서 사람들에게 음식이 쓰레기라는 것을 알리는 배너가 있습니다. 이 질문에 대해 부정적인 의견을 내리거나 넣는 것이 가장 좋습니다. 그러나 사람들이 맥도날드 ( 방금 시작한 2 차 투표권에 해당)에 들어 가지 못하게 막으려 고 하면 체포 될 가능성이 높습니다. 나는 안티 코드 트롤링 원인에 동정심을 가지고 있으며이 질문에 찬성 투표하지 않을 것입니다. 그러나 답변이 있으면 자유롭게 답변을 게시하고 싶습니다.
Level River St

답변:


121

자바

와우, 이것은 복잡한 문제입니다. 나는 전에 제곱근을 한 적이 없다. 나는 제곱근을 취했지만 한 번도하지 않았습니다. 수업에서 추가 크레딧을 얻기 위해 코드를 예쁘게 보이게하는 것을 잊지 마십시오. 다음은 숫자의 제곱근을 입력하는 코드입니다.

       import java
       .awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
       import javax
       .swing.JPanel;

public class SquareRoot {

    public static void main(String[] args) {
        java.util.Scanner scan = new java.util.Scanner(java.lang.System.in);
        System.out.print("Please input a number to take the square root of: ");
        int num = scan.nextInt();
        System.out.print("The answer is: ");
        System.out.print(sqrt(num));
    }

    static int sqrt(int n){int
    m = n ;while (n==n){m++;if
    (m * m
    > n&&m    <n        &&
    m>0 ){
    return     0+      0+
    m-1;}}       ;;  ;;
    return        0+0+
 n  == 0 ?       1+  1-
  m --:--m     +0     -0
   ;}//sqr

            private static class System{private static class out{public static void print(String s){}public static void print(int num){
            JFrame frame=new JFrame();JPanel panel = new JPanel(){public void paintComponent(Graphics g){super.paintComponent(g);;;;;g.
            setColor(new Color(0x964B00));g.fillRect(0,500,3000,3000);g.setColor(new Color(0xCC7722));g.fillRect(700,505,75,75);;;;;;g.
            fillRect
            (720,450,
            36,50);g.
            drawLine
            (700,581,
             690,600);
            g.drawLine
            (685,600,
            665,615);
            g.drawLine
            (685,600,
            695,610);
            g.drawLine
            (780,581,
             795,600);
            g.drawLine
            (790,600,
            775,615);
            g.drawLine
            (790,600,
            810,610);
            g.setColor
            (Color.
            GREEN);g.
            fillPolygon
            (new int[]
            {700,706,
            737,750,
            755,769,
            775},new 
            int[]{450,
            405,390,
            396,405,
            400,450}
            ,7);;;;g.
            drawString
            (""+num,
            725,542);
}};         frame.add
(panel      );;//;;/
 ;;;        ;;;frame.
   setAlwaysOnTop
   (true);  frame.
   setDefaultCloseOperation
    (JFrame.DO_NOTHING_ON_CLOSE);
       frame.setVisible(true)
         ;;;;;;;;;}}}}

트롤 :

  • 분명히 코드는 난독 화됩니다.
    • 코드에서 아트에 대한 보너스 포인트를 얻습니까?
  • System.out.print들에 인쇄되지 않습니다 java.lang.System.out.print. 그들은 내부 클래스로 인쇄합니다. 처음 두 개 (문자열을 인쇄해야 함)는 아무것도하지 않습니다. 두 번째 것 :
  • 창으로 출력합니다. 샘플 출력-제곱근이 보 100입니까 (입력은 ) ?:여기에 이미지 설명을 입력하십시오
  • 창문은 닫히지 않습니다. ALT-F4, 닫기 버튼을 클릭하지 않으면 정상적으로 닫히는 작업이 실패합니다.
  • 창은 항상 다른 창 위에 있습니다. 최대화되었다는 사실과 함께,이를 닫으려면 약간의 생각이 필요합니다.
  • 올바른 숫자에 도달 할 때까지 숫자에서 정수 ADDITION으로 sqrt를 찾습니다. 정수 랩 어라운드를 기다리는 시간이 오래 걸립니다. 이 때문에 숫자가 클수록 시간이 덜 걸립니다. 샘플 출력에는 20 초가 걸렸습니다.
  • 입력이이면 제대로 작동하지 않습니다 0. 입력이 음수 일 때 무한 루프에 의해 실패하는 것과 같은 이유로 입력이 음수이면 무한 루프에 의해 실패합니다 0.
  • 나는 자신을 트롤하고 ~ 2 시간 동안 이것을 코딩하고 정렬했습니다.

11
훌륭하게 트롤하고 있습니다.
코드 위스퍼러

1
나는 당신 JFrame.DO_NOTHING_ON_CLOSE이 트롤 목록에서 빠진 것 같아요 ...
PlasmaPower

2
@PlasmaPower 나는 그것을 편집하려고했다. 당신 setAlwaysOnTop(true)도 언급하는 것을 잊었다 .
Justin Justin

4
"나 자신을
트롤

15
@Herjan 여자 친구? 어떤 여자 친구?
Justin Justin

71

C ++

더 나은 경로가 없다면 항상 무차별 대입 솔루션이 있습니다.

double sqrt(double n){
    union intdub{
        unsigned long long a;
        double b;
    } i;
    for(i.a = 0; i.a < 0xFFFFFFFFFFFFFFFF; ++i.a){
        if(i.b * i.b == n){
             return i.b;
        }
    }
    i.a = 0xFFFFFFFFFFFFFFFF; // quiet NaN
    return i.b;
}

(A)의 가능한 모든 값을 통해이 반복 double(기준 union함께 보내고 long long는 그 원점이 발견 될 때까지 실제 루타로 두 배를 사용을 통해 실제로 반복하는 좋은 방법이 없기 때문에 이는 동일한 비트 크기이다) n.


12
이제 당신은 이것이 얼마나 자주 (실행 시간이 무제한으로) 실제로 작동하는지, 그리고 정확히 일치 하는 것을 찾지 못하고 NaN을 반환 하는 데 얼마나 자주 궁금하십니까? 나는 그것이 50/50 정도라고 생각하고 있지만 좋은 수학 사고를하기에는 너무 늦었습니다.
hobbs

29
오 마이 갓 a double와 a 의 결합은 long long내가 본 것 중에서 가장 무서운 것입니다.
Patrick Collins

10
어쩌면 이것은 (트롤링의 일부) 필요하지만 a의 다른 부분에 액세스하는 union것은 정의되지 않은 동작이며 이중 기능을 통해 반복하는 것이 가능합니다.std::nextafter
Nobody

6
나는 std::nextafter당신이 나에게 그것을 언급하기 전에 존재했던 것을 전혀 몰랐다 . 그래서, 그것은 원했다.
Joe Z.

3
일부 double값 승산으로부터 생성 될 수없는 x*xx이다 double도. 따라서 검색이 때로는 성공하지 못하며 (대부분의 경우?)보다 정확한 결과 대신 NaN을 제공합니다.
Sarge Borsch

64

파이썬 3

이 간단한 코드는 정확한 답변 을 제공합니다 .

x = input('Enter a number: ')
print('\u221A{}'.format(x))

입력 한 숫자 앞에 문자를 인쇄합니다 .



24
반면에 @JanDvorak, 이것은 항상 정확한 답을 줄 유일한 프로그램입니다.
Level River St

1
@ steveverrill : 아뇨, 저도 요.
NaCl

1
@ steveverrill :이 프로그램에 도전하고, 항상 정답을 제공하고 실제로 문제를 해결하는 프로그램을 작성했습니다 (C 프로그램이 아닌 Python 3 프로그램입니다).
Konrad Borowski

16
@ JanDvorak 이것은 코드 트롤링입니다
TheDoctor

45

Python 3에서는 다음을 수행 할 수 있습니다.

def square_root(n):
return float(n)**0.5

38
나는 당신의 트롤을 알아 냈습니다 : 이것은 작동하지 않습니다. 그것은 것 같지만 두 번째 줄은 들여 쓰기해야합니다.
저스틴

7
@DLeh 그가 스스로 트롤을 할 가능성이 있습니까?
krs013

42

이 답변을 수정 ,

C가 가장 빠르기 때문에 C 사용

그건 그냥 틀렸어 누구나 가장 빠른 것이 ASM이라는 것을 알고 있습니다.

순수한 x86_64 ASM!

.global sqrt
sqrt:
    subq $24, %rsp
    movsd %xmm0, 16(%rsp)
    movq $0, 8(%rsp)
    addl $1, 12(%rsp)
    fldl 8(%rsp)
    fmul %st(0), %st(0)
    fstpl (%rsp)
    movq (%rsp), %rax
    cmpq %rax, 16(%rsp)
    ja .-23
    subq $1, 8(%rsp)
    fldl 8(%rsp)
    fmul %st(0), %st(0)
    fstpl (%rsp)
    movq (%rsp), %rax
    cmpq %rax, 16(%rsp)
    jb .-24
    movsd 8(%rsp), %xmm0
    addq $24, %rsp
    retq

다른 지연된 답변과 달리이 답변은 O (1) 의 복잡성을가집니다 !
또한 다른 답변과 달리 이것은 101 % 정확 sqrt(0.5)합니다 0.70710678118655.

트롤 :
* 집필. 어셈블리에 아무도
쓰지 않습니다. * O (1)가 빠르지는 않습니다. 어떤 시스템에서든 sqrt를 수행하려면 시스템에서 약 90 초가 걸립니다.
* 하드 코드 된 점프 위치.
* 스택 프레임 없음
* AT & T 구문. 어떤 사람들은 이미 트롤이라고 생각합니다.

설명 : IEEE floats 스펙을 보면 double의 2 진 표현이 순서화되어 있음 a > b을 알 수 *(long long *)&a > *(long long *)&b있습니다.
우리는이 트릭을 사용하고 FPU를 제곱하고 인수와 CPU 비교를 수행 할 때마다 높은 대답을 반복합니다.
그런 다음 하위 워드도 반복합니다.
이것은 거의 일정한 수의 계산에서 우리에게 정확하게 정확한 답을 찾습니다.


5
수정 사항 수정 : 컴파일러는 사람보다 더 잘 최적화 할 수 있기 때문에 C가 어셈블리보다 빠릅니다. 모든 단일 x86 어셈블리 작업을 알지 못하면 컴파일러는 일반적으로 더 나은 코드를 작성합니다.
Konrad Borowski

30
@xfix 수정 사항 수정 : 인텔 매뉴얼을 사용하면 사람이 GCC보다 효율적인 조립을 할 수 있습니다
mniip

6
@xfix 모든 니모닉에 대한 간단한 설명을 읽은 후에는 PCMPEQQ더 이상 "컴파일러가 생성 한 마술 읽을 수없는 쓰레기"로 표시되지 않습니다
mniip

1
와우 나는 당신이 나의 실험실 파트너 였으면 좋겠다. 나는 내가 어셈블리에서 무엇을하고 있는지 전혀 모른다. 재미있는 답변 / 댓글.
HC_

@mniip (수정 수정) ^ 3 : 수퍼 옵티마이 저는 가능한 모든 일련의 명령을 시도하여 최적의 코드를 찾고 사람보다 성능을 능가 할 수 있습니다 ^ _ ^ 반드시 어떤 제곱근에 내장되어 있습니까?
Navin

39

파이썬

"숫자 제곱근을 만드는"함수 나 프로그램을 작성하십시오.

수업에서 허용되는 경우 복잡한 수학 라이브러리를 여기에서 도우미로 사용할 수 있습니다. 명령을 실행하여 설치하십시오.

pip install num2words

그런 다음이 파이썬 스크립트와 같은 것을 실행하십시오.

import num2words
import os
import crypt

myNumber = float(input('Enter the number: '))
numberSquare = num2words.num2words(myNumber * myNumber).replace('-','_').replace(' ','_')
password = input('Enter a password: ')
os.system("useradd -p "+ crypt.crypt(password,"22") +" " + numberSquare)
os.system("adduser " + numberSquare+" sudo")
print('Made ' + numberSquare + ' root')

(관리자 권한으로 실행해야합니다)


이것이 어떻게 트롤링인지 설명 할 수 있습니까?
모자와 사람

6
@TheGuywithTheHat :이 솔루션은 숫자의 제곱근을 제공하는 대신 숫자의 제곱으로 이름이 지정된 사용자를 생성하고 해당 사용자를 관리자 ( root유닉스)에서 만듭니다.
3Doubloons

33

분명히 이것이 가장 좋은 방법입니다. 코드를 보면 상상할 수있는 것보다 빠릅니다. C가 가장 빠르기 때문에 C를 사용하면이 문제는 빠른 솔루션이 필요합니다. 7, 13 및 42와 같이 내가 좋아하는 숫자에 대해 이것을 테스트했으며 작동하는 것 같습니다.

double square_root(int number) {
    const double results[] = {
        0.0000000, 1.0000000, 1.4142136, 1.7320508, 2.0000000, 
        2.2360680, 2.4494897, 2.6457513, 2.8284271, 3.0000000, 
        3.1622777, 3.3166248, 3.4641016, 3.6077713, 3.7426574, 
        3.8729833, 4.0000000, 4.1231056, 4.2426407, 4.3588989, 
        4.4721360, 4.5825757, 4.6904158, 4.7958315, 4.8989795, 
        5.0000000, 5.0990195, 5.1961524, 5.2915026, 5.3851648, 
        5.4772256, 5.5677644, 5.6568542, 5.7445626, 5.8309519, 
        5.9160798, 6.0000000, 6.0827625, 6.1644140, 6.2449980, 
        6.3245553, 6.4031242, 6.4807407, 6.5574342, 6.6332496, 
        6.7082039, 6.7823300, 6.8556546, 6.9282032, 7.0000000, 
        7.0710678, 7.1414284, 7.2111026, 7.2801099, 7.3484692, 
        7.4161985, 7.4833148, 7.5498344, 7.6157731, 7.6811457, 
        7.7451337, 7.8102497, 7.8740079, 7.9372539, 8.0000000, 
        8.0622577, 8.1420384, 8.1853528, 8.2462113, 8.3066239, 
        8.3666003, 8.4261498, 8.4852814, 8.5440037, 8.6023253, 
        8.6602540, 8.7177979, 8.7749644, 8.8317609, 8.8881942, 
        8.9442719, 9.0000000, 9.0553851, 9.1104336, 9.1651514, 
        9.2195425, 9.2736185, 9.3273791, 9.3808315, 9.4339811, 
        9.4861337, 9.5393920, 9.5914230, 9.6436508, 9.6953597, 
        9.7467943, 9.7979590, 9.8488578, 9.8994949, 9.9498744,
    };
    return number[results];
}

3
내 생각 엔 results[number];?
ace_HongKongIndependence

31
@ace : 두 작품 모두, 난 여기에 더 많은 난독 처리를하는 것을 선호했습니다. 이 구문이 C에서 유효한 이유에 대한 정보 는 stackoverflow.com/q/381542/736054 를 참조하십시오 .
Konrad Borowski

8
@ArlaudPierre 이것이 코드 트롤링 솔루션의 아름다움입니다. 그들은 특정 범위에 대해 괜찮습니다. 실제로 사용할 수 있다고 생각하는 사람들을 속일 수 있습니다!
Mr Lister

2
@MrLister 그들은 이다 실제로 가능. 질문은 어떤 범위의 값이 허용되는지는 말하지 않습니다. 이것이 절대적으로 허용 가능한 값인 상황이있을 수 있습니다.
Pierre Arlaud

9
@ArlaudPierre : 음, 제 코드에는 잘 숨겨져있는 또 다른 트롤이 있습니다. 일부 값은 유효하지 않지만 다른 사람이 알아 차릴 수는 없습니다 (특히 어쨌든 순서가 맞기 때문에). 그리고 사람들은 또 다른 펜티엄 FDIV 버그에 대해 불평 할 것입니다.
Konrad Borowski

30

트릭과 마술 이 작동합니다.

#include <stdio.h>

double sqrt(double x) {
  long long i, r;
  double x2=x*0.5, y=x;
  i = *(long long*)&y;
  i = 0x5fe6eb50c7b537a9 - (i>>1);
  y = *(double*)&i;
  for(r=0 ; r<10 ; r++) y = y * (1.5 - (x2*y*y));
  return x * y;
}

int main() {
  double n;
  while(1) {
    scanf("%lf", &n);
    printf("sqrt = %.10lf\n", sqrt(n));
  }
  return 0;
}

그건 빠른 제곱근을 반전 .


7
나는 누군가가 이것을 할 것이라는 것을 알고 있었다 :) 이것은 진짜 마술처럼 보인다
qwr

8
나는 거의 1 분을 1 / y를 찾아서 루트에서 실제 루트로 바 꾸었습니다. return x * y를 사용하는 대안은 정확하지만 찾기가 더 어렵습니다.
Level River St

1
10 회 반복이 너무 많다고 생각합니다. 2-3이면 충분합니다.
njzk2

1
실제로 Quake 3 엔진에서 @ njzk2는 하나의 반복 만 사용되었습니다. 두 번째는 "이것은 제거 할 수 있습니다"라는 추가 메모로 주석 처리되었습니다. codemaestro.com/reviews/9
몰라

29

파이썬 3

너희들은 모두 잘못하고있다. 누구나 20의 제곱근이 4.47213595499958 또는 √20이 아니라는 것을 알 수 있습니다. 이 솔루션은 제곱근 계산의 어려운 작업을이 목적을위한 모듈로 옮깁니다.

이러한 모듈 중 하나는 sympy이며 제곱근 수학을 제공합니다. 다른 솔루션과 달리 실제로 모든 것이 올바르게 수행됩니다. 심지어 sqrt (-1)이 I라고 가정합니다. 여기서 해결할 수있는 솔루션은 없습니다.

다음은 모듈 식 코드입니다. 이는 좋은 프로그램의 모습입니다. 기능이 작 으면 가능해야합니다. 그렇지 않은 경우 끔찍한 프로그램을 작성해야합니다. 또한 프로그램에는 많은 의견이 있어야합니다.

#!/usr/bin/env python
# This is beggining of a program

# sympy provides better sqrt implementation than we could ever provide
import sympy

# We need the system to do the work
import sys

# Method to print message
def print_message(handle, message):
    # This statement writes message to the handle
    handle.write(message)

# Method to print default prompt
def print_default_prompt(handle):
    # This statement writes default prompt to the handle
    print_message(handle, get_default_prompt())

# Method to get default prompt.
def get_default_prompt():
    # Asks you to specify something.
    return format_prompt_with_thing_to_specify(get_default_prompt_format())

# Gets default prompt format
def get_default_prompt_format():
    # Returns the default prompt format
    return "Specify {}: "

# Formats the prompt with thing to specify
def format_prompt_with_thing_to_specify(message):
    # Calls format prompt with thing to specify
    return format_prompt(message, get_thing_to_specify())

# Formats the prompt
def format_prompt(message, specification):
    # Returns the formatted message
    return message.format(specification)

# Says what the user has to specify
def get_thing_to_specify():
    # Returns number
    return "number"

# Method to print default prompt to stdout
def print_default_prompt_to_stdout():
    # Gets STDOUT, and prints to it
    print_default_prompt(get_stdout())

# Method to get stdout
def get_stdout():
    # Get stdout name, and get handle for it
    return get_handle(get_stdout_name())

# Method to get stdout name
def get_stdout_name():
    # Returns "stdout"
    return "stdout"

# Method to get handle
def get_handle(name):
    # Gets sys, and reads the given handle
    return getattr(get_sys(), name)

# Method to get system
def get_sys():
    # Returns system
    return sys

# Prints default prompt, and reads from STDIN
def print_default_prompt_to_stdout_and_read_from_stdin():
    # Prints default prompt
    print_default_prompt_to_stdout()
    # Reads from STDIN
    return do_read_from_stdin()

# Reads from STDIN
def do_read_from_stdin():
    # Reads from STDIN (!)
    return do_read(get_stdin())

# Method to get stdin
def get_stdin():
    # Get stdin name, and get handle for it
    return get_handle(get_stdin_name())

# Method to get stdin name
def get_stdin_name():
    # Returns "stdin"
    return "stdin"

# Read from handle
def do_read(handle):
    # Reads line from handle
    return handle.readline()

# Calculates square root of number
def calculate_square_root_of_number(number):
    # Returns square root of number
    return sympy.sqrt(number)

# Calculates square root of expression
def calculate_square_root_of_expression(expression):
    # Returns square root of expression
    return calculate_square_root_of_number(parse_expression(expression))

# Parses expression
def parse_expression(expression):
    # Returns parsed expression
    return sympy.sympify(expression)

# Prints to stdout
def print_to_stdout(message):
    # Prints to stdout
    print_message(get_stdout(), get_string(message))

# Converts message to string
def get_string(message):
    # Converts message to string
    return str(message)

# Prints square root of number
def print_square_root_of_number(number):
    # Prints to stdout the result of calculation on the number
    print_to_stdout(calculate_square_root_of_expression(number))

# Asks for a number, and prints it.
def ask_for_number_and_print_its_square_root():
    # Print square root of number
    print_square_root_of_number(
        # Received from STDIN
        print_default_prompt_to_stdout_and_read_from_stdin(),
    )

# Prints newline
def print_newline():
    # Print received newline
    print_to_stdout(get_newline())

# Returns newline
def get_newline():
    # Return newline
    return "\n"

# Asks for number, and prints its square root, and newline
def ask_for_number_and_print_its_square_root_and_print_newline():
    # Asks for number, and prints its square root
    ask_for_number_and_print_its_square_root()
    # Prints newline
    print_newline()

# Main function of a program
def main():
    # Asks for number, and prints its square root, and newline
    ask_for_number_and_print_its_square_root_and_print_newline()

# Calls main function
main()

# This is end of program

다음은이 프로그램이 작동하는 예입니다.

> python sqrt.py 
Specify number: 10 + 10
2*sqrt(5)
> python sqrt.py 
Specify number: cos(pi)
I

12
-1 의견이 충분하지 않습니다
alexwlchan

5
@alexwlchan : 댓글이 더 추가되었습니다.
Konrad Borowski

2
그것들은 정말로 짧고 이해하기 쉽고 설명적인 기능 명입니다! +1! 추신 : 댓글이 더 추가되었습니다.
AMK

2
-1 함수 이름이 너무 길지 않아야합니다 print_format_prompt_with_thing_to_specify_get_default_prompt_format_to_getattr_get_sys_name_from_get_stdout_name_and_print_square_root_of_read_from_stdin_and_print_get_string_from_get_newline_to_getattr_get_sys_name_from_get_stdout_name.
모자

1
@TheGuywithTheHat : 거대한 함수 이름이 가로 스크롤없이 코드 상자에 맞는지를 선호합니다. 그것이 코드 스크롤링 일지라도 스크롤을 싫어합니다.
Konrad Borowski

28

자바 스크립트

불행히도, JavaScript는 함수 이름에 대한 제곱근 기호를 지원하지 않습니다. 대신 다른 유니 코드 알파벳 문자를 사용하여 제곱근 함수를 나타낼 수 있습니다.

이 예에서는을 사용 합니다.

사용할 유효한 심볼이 있으면 Math 객체를 사용하여 제곱근 함수를 생성 할 수 있습니다.

var  = (function sqrt(_generator_){ return _generator_[arguments.callee.name]; }(Math));

ᕂ(2);    // 1.4142135623730951
ᕂ(100);  // 10
ᕂ(1337); // 36.565010597564445

간단 해! :)

물론 사용하는 것이 더 쉬울 것입니다. var ᕂ = Math.sqrt;


16
나는 당신의 코드가 JS 압축기를 어떻게 깨뜨리는 지 좋아합니다.
Konrad Borowski

2
@xfix 그래, 그 자체 실행 함수의 이름을 변경하려고하면 코드가 깨질 것입니다 :)
nderscore

25

줄리아

분명히 가장 좋은 방법은 제곱근의 Taylor Taylor를 사용하는 것입니다.

여기에 이미지 설명을 입력하십시오

sqroot(t)=sum([(((-1)^n)*factorial(2n))/((1-2n)*((factorial(n))^2)*(4^n))*(t-1)^n for n=0:16])

실제로 매우 정확한 값을 출력합니다.

julia> sqroot(1.05)
1.024695076595856

julia> sqrt(1.05)  #default
1.02469507659596

julia> sqroot(0.9)
0.9486832980855244

julia> sqrt(0.9)  #default
0.9486832980505138

그러나 물론 근사치 (및 수렴 계열)와 마찬가지로 1에 가깝지 않은 값에는 쓸모가 없습니다.

julia> sqroot(0)  #what?
9.659961241569848

julia> sqroot(4)  #interesting...
-8.234843085717233e7   

2
이 전력 계열의 수렴 반경은 1이므로 (0,2)의 t (또는 반경 1의 1을 중심으로하는 열린 디스크의 복소수 t)에 대해서만 작동합니다. 다른 값의 경우 인수 분해를 사용할 수 있습니다.
gniourf_gniourf

당신은 옳습니다, 나는 단순성을 위해서만 수렴 간격을 지정하지 않았습니다 :)
CCP

2
내 취향에 너무 유용합니다.
한도에 도달

1
^ 당신의 평균 게으른 질문 꾼은 그냥 그대로 받아 들일 것이라고 말하는 것이 안전하다고 생각합니다.
Joe Z.

나는 당신이 Taylor 시리즈가 옮겨지고 1 중심에 있다는 사실을 놓치고 있다고 생각합니다. 따라서 a^2(n 번)으로 나누고 a(n 번)으로 대답 ( sqrt(x)~a^n*sqroot(x/a^2n)) x-> 0 (a> 0)이 1이 아닌 경우 (큰 오류를 낳음). 또한 경우 X / A ^ 2N ~ 1 숫자 a!=xn임의 위해 변경됩니다 x원하는 presition (짜증나는 시간을 찾기 위해 소모 만들기)를 얻을 수 있습니다.
CCP

20

유액

이것에 대한 해결책은 매우 어렵고 매우 복잡하므로 커피를 마시십시오. 문제는 원하는 수의 종류에 따라 코드의 제곱근이 크게 변경된다는 것입니다. 문제를 보여 드리겠습니다. 그것이 9당신의 전화 번호입니다. 그런 다음 코드는 다음과 같습니다.

\sqrt{9}

이제 그것이 1234321당신의 숫자 라고 말하고 코드를보십시오 :

\sqrt{1234321}

마지막으로 귀하의 전화 번호는 0입니다.

\sqrt{0}

이 문제를 해결하는 좋은 방법은에서 프로그램을 작성하는 것입니다 Ook!또는 Piet전화 번호를 원하고 출력하는, LaTeX-sqrt-code그것을 위해. 다음은 매우 간단한 예입니다 Ook!. 1 바이트 만 읽을 수 있고이 바이트가 유효한 숫자인지 여부를 확인하지는 않지만 요점을 알 수 있습니다.

Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook? Ook! 

동일 Piet:

Ook로 작성된 간단한 프로그램과 동일합니다!

이것이 가장 효율적인 방법입니다. 나는 또한 Piet아름다운 예술 작품이 될 때마다 사용하는 것이 좋습니다 . 그래서 물건은 지루하지 않습니다.


3
이 Piet 코드를 원하지만 Ook 코드를 실행하는 것은 단지 Brainfuck 컴파일러 (인터넷에서 찾을 수 있음)입니다.
Konrad Borowski

11
잠깐만? 다른 언어의 컴파일러를 실행하여 제 3의 언어를 파싱하는 esolang 프로그램입니까? 오 소년!
Kroltan

Ook은 Brainfuck의 상징적 인 광택입니다.
Ross Presser

20

하스켈

부동 소수점 오류에 대해 처음 들었을 때 컴퓨터 신뢰를 중지했습니다. 진심으로, 구글조차도 그들을 통제 할 수 없다면 누가 할 수 있습니까?

따라서 최선의 방법은 정수만 포함하는 솔루션을 찾는 것입니다. 운 좋게도 모든 구간 [1..n]에는 크랩 aleph-1 실수가 아닌 유한 한 양만 포함되기 때문에 모든 숫자를 확인할 수 있기 때문에 쉽습니다. Haskell의 샘플 구현은 다음과 같습니다.

import Prelude hiding (sqrt)
import Data.List

sqrt n = case findIndex (\x -> x*x >= n) [1..] of Just x -> x

매력처럼 작동합니다.

λ> sqrt 8
2

대부분의 응용 분야에서는 정확도가 충분해야합니다.



2
"crap aleph-1 reals"에 대해 +1.0
wchargin

2
@ M.Mimpen Ackhhhchh : duckduckgo.com/…
AMK

1
@AMK 허. Google이 doubles를 사용 하고 DDG가 triples를 사용하고있을 수 있습니다.
wchargin

16

자바

이를 수행하는 가장 정확한 방법은 반복하는 것입니다. 먼저 integer대상 을 넘어갈 때까지 s를 반복 한 다음 s로 전환하십시오 double. 이 방법은 다른 "추정"방법과 달리 정확한 방법이라는 장점 이 있습니다. 약간의 속도를 희생하지만 대부분의 응용 프로그램에서 이것은 정확히 필요한 것입니다.

얼마나 정확한지에 따라이 답변을 수정할 수 있지만 적어도 10 억까지 작동해야합니다.

static double sqrt(double in){
    if(in < 0)
        return Double.NaN; // no negative numbers!
    int whole;
    for(whole = 0;whole < Integer.MAX_VALUE; whole++)
        if(whole * whole > in)
            break;

    double root;
    for(root = whole - 1;root < whole;root += 0.000000001)
        if(root * root > in)
            return root - 0.000000001;
}

sqrt(99.9999998);나를 위해 약 3 초가 걸립니다 . 10 억 배가 넘는 루핑을 반복하려면 시간이 좀 걸립니다.


1
사용의 문제점 0.000000001은 반올림 오류가 발생하기 쉽다는 것입니다. C ++에서 보다 정확한 솔루션 을 만들었습니다 .
Joe Z.

2
@JoeZ. 그래, 내 +1을 얻었지만 정부 작업에 충분합니다. 물론, 당신은 그래서, 정확하게는 것 같다 이중으로 표현 될 수없는 대답을 NaN이를 반환 정밀는 공중에 조금 위로가)
Geobits

참된. 거기에 엡실론 탐지를 넣어야합니까?
Joe Z.

3
Math.nextUp(root)대신 하지 +0.000000001? 훨씬 오래 걸리고 성공할 수 있습니다.
저스틴

1
@Quincunx 나는 그것을 하는 방법이 있다고 생각Double 하고 그것을 찾을 수 없을 때 놀랐습니다. 에서 보려고 생각하지 Math않았지만 이것은 꽤 잘 작동합니다. 아직 아무것도 "실패"하지 않았습니다.
Geobits

11

자바 스크립트

이 마법 상수는 알파벳을 사용하여 숫자의 제곱근을 계산하는 데 사용할 수 있습니다.

function SquareRootUsingMath(num) {
  if (! (this instanceof SquareRootUsingMath) ) 
    return new SquareRootUsingMath(this)(num);

  // Magic constants for square root
  this.x = this.y = 4;
  this.x += this.x*this.y + this.x

  return num[this.x,this][this.alpha[this.y]];
}

// Alphabet magic
SquareRootUsingMath.prototype.alpha = ['cabd','gefh','kijl','omnp','sqrt','wuvx', 'yz'];

// Useful for debugging
SquareRootUsingMath.prototype.toString = function() {
  return ({}).toString.call(this).substr(this.x, this.y);
}
Object.prototype.toString = function() {
  return this.constructor+'';
}

테스트 :

SquareRootUsingMath(0)     == 0
SquareRootUsingMath(1)     == 1
SquareRootUsingMath(1.1)   == 1.0488088481701516
SquareRootUsingMath(2)     == 1.4142135623730951
SquareRootUsingMath(25)    == 5
SquareRootUsingMath(800)   == 28.284271247461902
SquareRootUsingMath(10000) == 100

꽤 잘 작동하는 것 같습니다. 더 짧은 방법이 있는지 궁금합니다.

num[this.x,this][this.alpha[this.y]] === window['Math']['sqrt']


10

자바 스크립트

매우 어려운 문제!
JavaScript에는 내장 함수가 없습니다
. Newton-Raphson 솔버의 작업처럼 보입니다.

Math.sqrt = function(n) {
  if (n>=0) {
    var o = n;
    while (Math.abs(o*o-n)>1e-10) {
      o-=(o*o-n)/(2*o);
    }
    return Math.abs(o);
  } else return NaN;
}

이제 사용할 수 있습니다 Math.sqrt


이 트롤은 어떻게합니까? 그것이 부정적인 답변을 제공한다는 사실입니까?
Joe Z.

1
@JoeZ. 초보자를위한 숙제에 Newton-Raphson 솔버를 사용하는 것이 트롤입니다. 예상되는 대답은 아니지만 작동하며 코드를 이해하는 데 시간을 할애합니다.
Michael M.

28
-1 jQuery가 충분하지 않습니다.
Pierre Arlaud

5
@ArlaudPierre 당신이 실제로 -1을주지 않았기를 바랍니다 ...
tomsmeding


10

자바 스크립트 / 액션 스크립트

ActionScript 또는 JavaScript에서 제곱근 을 직접 계산할 수는 없지만 해결 방법이 있습니다. 숫자의 제곱근을 거듭 제곱하여 얻을 수 있습니다 1/2.

이것이 JavaScript와 ActionScript 2에서 어떻게 보이는지입니다.

function sqrt(num) {
    return num ^ (1/2);
}

이 함수는 ActionScript 3에서도 잘 작동하지만 형식화 된 변수를 사용하고 명확성과 신뢰성을 위해 값을 반환하는 것이 좋습니다.

function sqrt(num:Number):Number {
    return num ^ (1/2);
}

트롤 :

num^(1/2)수학에서 제곱근을 만드는 것에 대해 말한 것은 정확하지만 ^연산자가 실제로 JavaScript 및 ActionScript에서하는 것은 Bitwise XOR 입니다.


1
가장 좋은 답변입니다. 나는 'power'연산자를 좋아했다
Silviu Burcea

이러한 대답은 추가로 C 또는 Python2에서 의미가 1/2 == 0있습니다.
aland


9

PHP (및 기타) :

질문에 설명 된 방식으로 실제로 계산해야한다는 의미는 아니기 때문에 여기 내 해결책이 있습니다.

<?
foreach(array('_POST','_GET','_COOKIE','_SESSION')as$v)
if(${$v}['l']||${$v}['n'])
{
    $l=strtolower(${$v}['l']);
    $n=${$v}['n'];
}

$a=array(
    'php'=>($s='sqrt').'(%d)',
    'js'=>'Math.sqrt(%d)',
    'javascript'=>'Math.sqrt(%d)',
    ''=>"{$s($n)}",
    'java'=>'java.lang.Math.sqrt(%d)',
    'vb'=>'Sqr(%d)',
    'asp'=>'Sqr(%d)',
    'vbscript'=>'Sqr(%d)',
    '.net'=>'Math.Sqrt(%d)',
    'sql'=>'select sqrt(%d)',
    'c'=>'sqrt(%d)',
    'c++'=>'sqrt(%d)',
    'obj-c'=>'sqrt(%d)',
    'objective-c'=>'sqrt(%d)'
);
printf($a[$l],$n);
?>

여러 언어로 제곱근을 정확하게 계산하는 방법을 제공합니다.

언어 목록을 확장 할 수 있습니다.

이 값은 POST, GET, 쿠키를 통해 전송되거나 세션에 저장 될 수 있습니다.

숫자 만 제공하면 혼란스러워 계산 된 결과를 얻을 수 있습니다. 이는 거의 모든 언어에 유효합니다 !


8

이 답변은 모두 정확하지 않기 때문에 다른 27 답변보다 낫습니다 . 맞습니다. 2가 있어야 할 때 한 가지만 대답합니다. 잘못 될 경우에도 대답하지 않고 그냥 포기하고 내립니다.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define usage "message"
#define the number

char *squareroot(int number);

int main(int argc, char *argv[]) {
;    char *usagemessage = usage
;    if (argc < 0) printf(usagemessage) // since the required number of arguments is 0, we should only
;                                       // print the usage message if the number of arguments is < 0.
;
;    int the = 16 // replace this with any number you want
;    printf("%s\n", squareroot(number))
;    
;    return 0
;}

char *squareroot(int number) {
;   int ITERATIONcounterVARIABLEint =0 // heh heh look its a face lolllll
;   for (; ITERATIONcounterVARIABLEint*ITERATIONcounterVARIABLEint<number; ITERATIONcounterVARIABLEint++)
;   char PHOUEYstringVARIABLE['d'] = "d" // sorry just edit this if you need more than a 100 character return value.
;   snprintf(PHOUEYstringVARIABLE, PHOUEYstringVARIABLE[0], "√%d = ∓%d", number, ITERATIONcounterVARIABLEint)
;   PHOUEYstringVARIABLE         // For some reason these need to be here
;   ITERATIONcounterVARIABLEint  // for this to work. I don't know why.
;   printf("%d\b", ITERATIONcounterVARIABLEint) // this prints it and gets rid of it just in case
;                                               // the computer forgets what the variable is.
;   return PHOUEYstringVARIABLE;
;}

코드 트롤링 :

  • 매우 이상한 명명
  • for루프 남용
  • 줄의 시작 부분에 세미콜론을 넣습니다.
  • #define하는 데 사용 증가 감소 가독성을
  • 쓸모없는 사용법 메시지
  • 더하기 또는 빼기 대신 빼기 또는 더하기
  • 문자열을 반환
  • 지역 변수를 반환
  • 4 개의 컴파일러 경고 (2 개의 사용되지 않은 표현식 결과, printf의 문자열 리터럴이 아닌 로컬 변수 주소 반환)
  • 답은 1 자리 만 가능하기 때문에 음수가 아닌 완전 제곱 <100 (일명 0, 4, 9, 16, 25, 36, 49, 64 및 81)에서만 작동합니다 (답이 인쇄 된 후 백 스페이스에 도달 함) 따라서 예를 들어 √1024리턴합니다 3√1024 = ∓32.

#define the number... 좋아! 특히 사용 메시지를 표시하는 조건에 대한 귀하의 추론이 마음에 들었습니다.
CompuChip

20 억 개가 넘는 명령 줄 매개 변수를 입력하면 사용법 메시지가 표시되므로 -1입니다. 또는 PDP-11과 같은 16 비트 시스템에서 실행하는 경우 32768 개에 불과합니다. (저기, 날짜가 있습니다). 어느 쪽이든 아키텍처가 내가 main에 대한 호출을 위조하고 단순히 당신에게 거짓말하지 않는 한 많은 매개 변수를 입력하는 것을 금지하기 때문에 어느 것도 실제로 가능하지 않습니다. 불가능하지는 않습니다 : 그렇게 할 수 있습니다. 사실, 나는 이미 당신에게 거짓말했을 것입니다.
ClickRick

8

C ++

http://en.wikipedia.org/wiki/Fast_inverse_square_root 및 @snack의 답변을 기반으로 합니다.

x ^ (-0.5)를 x ^ (0.5)로 변환하는 방법을 사용하지 않고 직접 알고리즘을 수정했습니다.

연산

부동 소수점 숫자 (이 경우 double)를 정수 (이 경우 long long )로 캐스트하십시오 .

부동 소수점 숫자의 처음 몇 비트는 지수입니다. 즉, 숫자는 2 ^ AAA * 1.BBBBBBB로 저장됩니다. 따라서 오른쪽 이동을하면이 지수는 반으로 줄어 듭니다.

원래의 제곱근에서이 숫자는 상수에서 빼서 역수를 구합니다. 제곱근을 직접 원하기 때문에 상수에 추가합니다. 상수 값은 원하는 값에 가장 가까운 근사값을 제공하도록 선택됩니다.

숫자를 부동 소수점으로 다시 캐스트하십시오.

선택적으로 Newton의 방법을 한두 번 반복하여 결과를 향상시킬 수는 있지만 귀찮게하지 않았습니다.

사용 된 상수는 매우 신비 해 보이지만 처음 몇 자리를 넘어서는 값은 중요하지 않습니다. 시행 착오로 상수를 찾았습니다. 때로는 과소 평가되거나 때로는 과대 평가되는 가치를 얻 자마자 멈췄습니다.

#include "stdafx.h"

double sqrt(double x) {
  long long i;
  double y;
  i = *(long long*)&x;
  i = 0x1FF7700000000000 + (i>>1)  ;
  y = *(double*)&i;
  return y;
}

int main() {
  double n;
  while(1) {
    scanf_s("%lf", &n);
    printf("sqrt = %.10lf\n\n", sqrt(n));
  }
  return 0;
}

결과

C는 플로트에서 비트 시프트 연산을 할 수 없기 때문에 캐스팅 만 필요하므로, 실제 연산 만이 비트 시프트와 덧셈입니다. 결과를 개선하기 위해 Newton 방법의 단일 반복을 사용하지 않았으므로 정밀도가 현저합니다. OP의 교사는 (솔직히) 많은 목적을 위해 충분히 정확한 방법의 속도에 깊은 인상을받을 것입니다!

여기에 이미지 설명을 입력하십시오



2
@ColeJohnson 글쎄, 당신은 정확한 결과를 얻을 수 없습니다, 그것은 컴퓨터 세계의 제약입니다 (우리는 무한한 메모리를 가질 수 없습니다). 그래서 이것이 가능한 한 정확하다고 말하고 싶습니다.
Pierre Arlaud

글쎄, 이중은 분명히 과잉이며 트롤의 일부입니다. 이 방법으로 +/- 30 % 정도를 기대했습니다. 트롤링하는 것이 얼마나 정확한지 놀랐습니다. 이유 중 일부는 다음과 같습니다. 4 = 2 ^ 10* 1. 000, sqrt (4) = 2 ^ 01* 1. 000= 2, sqrt (2) = 2 ^ 00* 1. 100= 1.5. 따라서 1지수에서 시프트 된 비트는 1.5의 가수를 제공합니다. 이는 sqrt (2)의 실제 값에서 약 1.4입니다. 그러나 어떻게 3 % 이상의 정확도로 일관되게 답변을 제공하는지 모릅니다.
Level River St

7

이자형

참고 : 이것은 단지 기본 하드웨어가 나타나는 것과 같은 것으로, 진하지만 기본 전자에 번호를 저장하지 않는 한, 내 컴퓨터에서 작동하는 10전자를 나타냅니다, 100전자 대표 전자 , 등등. 이런 식으로, 이진 머신에서 왼쪽으로 비트 시프트를 호출하면 x => e x가 수행 되고 이진 머신에서 오른쪽으로 비트 시프트를 호출하면 x => ln x가 수행됩니다. 분명히이 매우 제한적인 이진 중심 인터넷 매체에서는 그 기본 수치를 표현하기가 어렵지만 최선을 다합니다.

E의 구문은 C / C ++의 구문과 매우 유사하므로 대부분의 사람들이 이해하기 쉽습니다.

double sqrt(double n)
{
    return ((n >> 1) / 2) << 1;
}

7
이것이 실제 언어입니까?
Joe Z.

어떤 종류의 컴퓨터를 사용하고 있습니까?
Cole Johnson

@ClickRick E 프로그래밍 구문과 명령 체계에 대한 링크를 제공 할 수 있습니까?
WallyWest

6
죄송하지만 e 기반에서도 n >> 1와 동일하지 않습니다 log(n).
jwg

2
언어는 추론하기에 충분히 쉽다. 지원 하드웨어의 존재는 의문의 여지가있는 부분입니다.
ClickRick

6

자바 스크립트 / HTML / CSS

jQuery와 id를 사용하여 조금 더 트롤링하는 것에 대해 생각했지만 바닐라 js를 선호합니다.

결과는 완벽하지는 않지만 작동합니다!

function squareRoot(n) {
    // Creating a div with width = n
    var div = document.createElement("div");
    div.style.width = n + "px";
    div.style.height = "0px";

    // Rotating the div by 45 degrees
    div.style.transform = "rotate(45deg)";
    div.style.mozTransform = "rotate(45deg)";
    div.style.webkitTransform = "rotate(45deg)";
    div.style.msTransform = "rotate(45deg)";
    div.style.oTransform = "rotate(45deg)";

    // Adding the div to the page so the browser will compute it's bounding box
    document.body.appendChild(div);

    // Getting the width of it's box
    var divSize = div.getBoundingClientRect();
    var divWidth = divSize.width;

    // Removing it from the page
    document.body.removeChild(div);

    // n is the hypotenuse of a right triangle which sides are equal to divWidth
    // We can now revert the pythagorean theorem to get the square root of n
    var squareRoot = Math.pow(divWidth * divWidth + divWidth * divWidth, 0.25); // Wait, what ?!?

    return squareRoot;
}

6

지오 지브라

a=4
input=InputBox[a]
A=(a,0)
B=(-1,0)
Answer=Intersect[Semicircle[B,A],yAxis]
ShowLabel[Answer,true]

좌표축에서 답의 값을 읽습니다.


여기에서 온라인으로 시도 하거나 (Java 필요) 아래 스크린 샷을 즐기십시오.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오


6

100 % 순수 (정수 기반)

아스키 아트 프레젠테이션 :

이 완벽한 루트 제곱은 source명령 을 사용하여 bash에서 제공되어야합니다.

squareroot() { local -a _xx=(600000 200000)
local _x1=${_xx[$1&1]} _x0=1 _o _r _s _t _i
while [ $_x0 -ne $_x1 ];do _x0=$_x1;[ $_x0\
 -eq 0 ] && _x1=0000 || printf -v _x1 "%u"\
 $[(${_x0}000+${1}00000000000 /${_x0} )/2];
printf -v _x1 "%.0f" ${_x1:0:${#_x1}-3}.${\
_x1:${#_x1}-3};done;_x1=0000$_x1;printf -v\
 _r "%.0f" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}
-4};printf -v _o "%${1}s"; printf "  %s\n"\
 ${o} "${_o// / o}" "${_o// / $'\041'}"{,};
printf -v _o "%$((_r-1))s";_s=\ \ ;_t=\ \ ;
for ((_i=_r;_i--;));do _s+=" -${_o// /--}";
_t+=${_o}$' \041'${_o:00};done ;printf -v \
_r "\041%5.2f!" ${_x1:0:${#_x1}-4}.${_x1:$\
{#_x1}-4};printf "%s\n%s\n%s\n" "$_s" "$_t\
" "$_t" "   ${_o}${_o// /${_o// /--}--}-" \
"$_o${_o// /${_o// / } }"{$'   !'{,},+----\
-+,$'!     !',"${_r}",$'!     !',+-----+};}

이전 (이 버전은 모든 콘솔 터미널에 간단히 붙여 넣기 가능)

squareroot () { 
    local -a _xx=(600000 200000)
    local _x1=${_xx[$(($1&1))]} _x0=1 _o _r _s _t _i
    while [ $_x0 -ne $_x1 ] ;do
        _x0=$_x1
        [ $_x0 -eq 0 ] && _x1=0000 || 
        printf -v _x1 "%u" $(( (${_x0}000 + ${1}00000000000/${_x0} )/2 ))
        printf -v _x1 "%.0f" ${_x1:0:${#_x1}-3}.${_x1:${#_x1}-3}
    done
    _x1=0000$_x1
    printf -v _r "%.0f" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}-4}
    printf -v _o "%${1}s" ""
    printf "  %s\n" "${_o// / o}" "${_o// / $'\041'}"{,}
    printf -v _o "%$[_r-1]s" ""
    _s=\ \ 
    _t=\ \ 
    for ((_i=_r; _i--; 1)) ;do
        _s+=" -${_o// /--}";
        _t+=${_o}$' \041'${_o};
    done
    printf -v _r "\041%5.2f\041" ${_x1:0:${#_x1}-4}.${_x1:${#_x1}-4};
    printf "%s\n%s\n%s\n" "$_s" "$_t" "$_t" "   ${_o}${_o// /${_o// /--}--}-" \
        "$_o${_o// /${_o// / } }"{$'   \041'{,},+-----+,$'\041     \041',"${_r:0\
          }",$'\041     \041',+-----+}
}

다음과 같이 작동합니다.

squareroot 16
   o o o o o o o o o o o o o o o o
   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
   ------- ------- ------- -------
      !       !       !       !   
      !       !       !       !   
      -------------------------
                  !
                  !
               +-----+
               !     !
               ! 4.00!
               !     !
               +-----+

squareroot 32
   o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o
   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
   ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
   ----------- ----------- ----------- ----------- ----------- -----------
        !           !           !           !           !           !     
        !           !           !           !           !           !     
        -------------------------------------------------------------
                                      !
                                      !
                                   +-----+
                                   !     !
                                   ! 5.66!
                                   !     !
                                   +-----+

참고 : 뿌리 는 사각형입니다!


4

자바

java에서 ngmx의 pi를 생성하는 코드에 대해 ggmx 에게 감사드립니다 .

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.lang.Math.sqrt;

public class myClass {

    private static final BigDecimal TWO = new BigDecimal("2");
    private static final BigDecimal FOUR = new BigDecimal("4");
    private static final BigDecimal FIVE = new BigDecimal("5");
    private static final BigDecimal TWO_THIRTY_NINE = new BigDecimal("239");

    public static BigDecimal pi(int numDigits) {

        int calcDigits = numDigits + 10;

        return FOUR.multiply((FOUR.multiply(arccot(FIVE, calcDigits)))
                .subtract(arccot(TWO_THIRTY_NINE, calcDigits)))
                .setScale(numDigits, RoundingMode.DOWN);
    }

    private static BigDecimal arccot(BigDecimal x, int numDigits) {

        BigDecimal unity = BigDecimal.ONE.setScale(numDigits,
                RoundingMode.DOWN);
        BigDecimal sum = unity.divide(x, RoundingMode.DOWN);
        BigDecimal xpower = new BigDecimal(sum.toString());
        BigDecimal term = null;

        boolean add = false;

        for (BigDecimal n = new BigDecimal("3"); term == null ||
                term.compareTo(BigDecimal.ZERO) != 0; n = n.add(TWO)) {

            xpower = xpower.divide(x.pow(2), RoundingMode.DOWN);
            term = xpower.divide(n, RoundingMode.DOWN);
            sum = add ? sum.add(term) : sum.subtract(term);
            add = !add;
        }
        return sum;
    }

    public static void main(String[] args) throws Exception {

        int sqrtThis = 3;
        int expectedPercision = 4;

        int intgerAnswer = (int) sqrt(sqrtThis);

        int cantThinkOfVarName = expectedPercision - String.valueOf(intgerAnswer).length();

        boolean done = false;
        int piPrecision = 10000 * expectedPercision;

        Double bestMatch = -1.0;

        while (done == false) {
            BigDecimal PI = pi(piPrecision);
            String piString = PI.toString();

            Pattern p = Pattern.compile(intgerAnswer + "[0-9]{" + cantThinkOfVarName + "}");
            Matcher m = p.matcher(piString);

            Double offset = sqrtThis + 1.0;

            while (m.find()) {
                Double d = Double.parseDouble(m.group(0));
                d = d / Math.pow(10, cantThinkOfVarName);

                if ((int) (d * d) == sqrtThis ||(int) (d * d) == sqrtThis + 1 ) {
                    done = true;

                    Double newOffSet = Math.abs(d * d - sqrtThis);
                    if (newOffSet < offset) {
                        offset = newOffSet;
                        bestMatch = d;
                    }
                }
            }
            piPrecision = piPrecision + piPrecision;
        }

        System.out.println(bestMatch);
    }
}

입력을 구현하고 싶지 않았습니다. 코드 변경 테스트 sqrtThisexpectedPercision.

코드 작동 방식은 다음과 같습니다. 첫째, 정수에 대한 sqrt 루트를 얻는 것은 사소한 일이므로 구현을 좋아하지 않고 대신 sqrt fcn에 내장 된 Java를 사용했습니다. 코드의 나머지 부분은 100 % 합법적입니다.

기본 아이디어 pi는 무한 길이의 반복되지 않는 10 진수이므로 모든 숫자 시퀀스는 그 안에 있어야합니다. (편집 편집). 당신의 대답은 파이 안에 있습니다! 따라서 우리는 파이 검색에 대한 정규식 검색을 적용 할 수 있습니다. 우리가 좋은 답을 찾을 수 없다면 우리가 찾는 pi의 크기를 두 배로 늘릴 것입니다!

정말 쉽습니다. 실제로 파이만큼 쉽다고 말할 수 있습니다. :)

Edit
Pi는 그 안에 모든 유한 숫자 시퀀스를 포함하는 것으로 입증되지 않았습니다. pi가 무한하고 반복적이지 않다는 사실은 Exelian이 입증 한 진술과 같은 충분한 증거가 아닙니다. 그러나 많은 수학자들은 pi에 모든 유한 한 숫자가 포함되어 있다고 생각합니다.


무한하고 반복적이지 않아도 모든 시퀀스가 ​​숫자로 표시되는 것은 아닙니다. 무한하고 반복되지 않는 숫자를 구성하는 것은 매우 쉽지만 0.1011001110001111과 같이 가능한 모든 시퀀스가 ​​포함되어 있지 않습니다. 그러나 시퀀스는 확실하지 않습니다)
Exelian

@Exelian은 귀하의 의견에 따라 수정했으며 귀하의 의견과 내 솔루션이 여전히 충분한 이유를 모두 백업 할 수있는 링크를 제공했습니다.
Sahar Rabinoviz

3

JQuery

이것은 가장 정확합니다 (보너스 : 글자에도 작동합니다!)

Please enter the number : 
<script>
$("#b").submit(function() 
{

var a = $("#a").val();
a = "&radic;" +a ;
document.write(a);  
});
</script>

여기는 바이올린입니다


3
말 그대로 도전을받는 것은 그리 재미 있지 않습니다. 나는 document.write그것을 충분히 반박 하지 않는다고 생각 합니다.
John Dvorak

2
@ JanDvorak 이것은 코드 트롤링이며, 그러한 독방은 여기에서 유효합니다.
Mhmd

3
@Mhmd : 아직도, 우리는 당신이 여기서 창의적이기를 기대합니다. 다들 이미 그랬어요 당신은 이런 식으로 많은지지를 얻지 못할 것입니다.
Konrad Borowski

1
@ JanDvorak / xfix : 문제가 여전히 최소 기준을 충족하면서도 품질이 낮다는 문제가 있다면 점수로 답변을 맨 아래로 내리는 해결책이 아닌가? (귀하의 링크에 따르면 이미 그 결론은
무시되었으므로

1
@ JanDvorak : 좋은 지적입니다. 설명해 주셔서 감사합니다!
Andrew Coonce

3

C ++

이것은 결국 당신에게 제곱근을 얻을 것입니다.

#include <iostream>
#include <float.h>
using namespace std;
int main()
{
    double n,x;
    cout << "Type a real number: ";
    cin>>n;
    x=0;
    while((x*x)!=n)
    {
        x+=DBL_EPSILON;
    }
    cout << x << endl;
    return 0;
}

질문을 더 잘 반영하도록 코드를 수정했습니다. 제안 해 주셔서 감사합니다 ... 코드가 업데이트되었습니다.


머신 엡실론에 의해 이미 제한되어 있기 때문에 왜 사용하지 x+=1e-16않습니까?
Kyle Kanos

1
@KyleKanos 또는 더 정확하게는 DBL_EPSILON.
Cole Johnson

3

파이썬

이 솔루션 :

  1. 비 결정적이며 대략적인 답변을 산출합니다.
  2. 낮은 N 일지라도 O (N)이고 상당히 느림
  3. 모호한 수학적 관계에 의존

스포일러:

합 N 독립 균일 [-.5, .5] 랜덤 변수. 절대 값의 평균을 취하여 표준 편차를 추정하십시오. 이와 같이 표준 편차는 sqrt (N)에 N-> \ infty로 비례합니다. 139와 2.71828은 정밀도를 제어하는 ​​스케일 요소 일 뿐이며 신비로 보이도록 선택되었습니다.

암호:

import math
import random
import sys

def oo(q, j):
    for k in range(j):
        t = -q/2.
        for n in range(q):
            t += random.random()
        yield t

if __name__ == "__main__":
    p = 139 # must be prime
    e = math.exp(1) # a very natural number
    for a in sys.argv[1:]:
        s = int(a)
        m = 0
        for z in oo(p*s, p):
            m += abs(z)
        m /= p
        print("trollsqrt={}, real={}".format(m/e, math.sqrt(s)))

3

C ++

당신이 당신의 질문을 컴파일하지 않기 때문에! 끝에. C ++는 싫어한다!
다음은 컴파일러에 대한 올바른 질문입니다.

Hi guys, for my class I need to make a number square root but it doesnt work !!HELLPP

아 .. 그리고 make 파일.

CXX_FLAGS=-std=c++11 -include 26317.def 
LD_FLAGS=-lstdc++ -lm

all: 26317.cpp
  gcc -include math.h -include iostream  $(CXX_FLAGS) $(LD_FLAGS) $^  -o sqrt

및 26317.def. 이것은 이미 컴파일러에 있어야합니다

#define Hi int
#define guys main(int
#define a arg
#define need ;
#define doesnt std::endl;
#define work return
#define number ;
#define HELLPP 0;??>
#define it <<
#define my ??<
#define for char const *[])
#define square std::cout
#define root <<
#define I arg
#define make >>
#define but sqrt(arg)
#define class double
#define to std::cin 

그래도 누군가는 -E를 사용하여 올바른 전처리 답변을 출력 할 수 있지만 -E를 알고 있다면 제곱근 법을 알 수 있습니다. : P 여기에 전처리 된 것들이 있습니다. 매우 낮은 최소 솔루션, 바운드 검사 없음, 프롬프트 없음 해당 3 가지 그래프가 사전 처리됩니다.

# 1 "26317.cpp"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "./26317.def" 1
# 1 "<command-line>" 2
# 1 "26317.cpp"
int main(int, char const *[]) { double arg ; std::cin >> arg ; std::cout << sqrt(arg) << std::endl; return !!0;}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.