Yardım!! Karekök nasıl yapılır! [kapalı]


42

Selam millet, sınıfım için bir sayı karekök yapmam gerekiyor ama işe yaramıyor !! HELLPP!

Meydan okuma:

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

Not: Bu kod trolling. Bu yeni programcıya programlama başarısı yolunda rehberlik etmek için "faydalı" bir cevap verin! Yaratıcı ol!


63
@CloseVoters Kazanma kriterleri olmadığı için [code-trolling] konu dışı olarak kapatmak için oylamayı durdurun. Bu durumda, bu açıkça bir [popülerlik yarışması]. İsterseniz düzenleyin. Sırf beğenmemeniz, çünkü [kod trolling] herkes için mücadeleyi kapatmanız gerektiği anlamına gelmez. Açıkçası, bu tür bir meydan okuma gibi pek çok insan, cevapların sayısındaki gibi, bu nedenle, SE topluluk tarafından yönetilen bir site olduğundan, bu insanlar için açık bıraktı.
Justin,

12
@Quincunx Kayıt için, oyum Çok Geniş oldu. Kelimenin tam anlamıyla, "kareköklerle ilgili bir şeyler yapmak" dışında, gidecek hiçbir şey yok. (Hali hazırda onbeş cevap olduğu kanıtlanmıştır.)
Doorknob

7
Yakın seçmenler: Bunun, kapatılmamış diğer [kod trolling] sorulardan daha "geniş" olduğunu anlamama yardımcı olabilir misiniz ? Belki de burada geçerli bir yakın sebep var, ancak kod denetimi kategorisi doğal olarak çoğu zorluktan biraz daha geniş olacak. Aksi taktirde, bu amaçtan biraz mahrum kalacaktır.
Geobits

6
@Geobits, cevabın bile doğru olması gerekmediğini söyleyerek, bu "Kod yaz" kadar geniştir.
Peter Taylor

11
@ Gareth Bu ilginç bir benzetme, ancak orijinal yorumla eşleşmiyor. İnsanlara yemeğin saçmalık olduğunu söyleyen bir pankartla, bütün gün McDonalds'ın dışında durmaya davetlisiniz. Ve bu soruya olumsuz yorumlarınızı kaldırabilir / oy verebilirsiniz. Ancak, insanların fiziksel olarak McDonalds'a ( yeni başlayan ikinci tur oylama eşdeğeri) girmesini engellemeye çalışırsanız, büyük olasılıkla tutuklanırsınız. Anti-trolling karşıtı nedene biraz sempati duyuyorum ve bu soruyu aşırı derecede etkilemeyeceğim (veya azaltacağım). Ama eğer cevap varsa, cevap yazabilmek için özgürlüğü istiyorum.
Seviye River St

Yanıtlar:


121

Java

Vay, bu karmaşık bir problem. Daha önce hiç kare kök yapmamıştım. Karekök aldım, ama bir tane yapmadım. Kodunuzun derslerinizde fazladan kredi için güzel görünmesini sağlamayı unutmayın. İşte girilen sayının karekökünü yapan kod:

       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)
         ;;;;;;;;;}}}}

Troller:

  • Açıkçası, kod gizlenmiş durumda.
    • Koddaki sanat için bonus puanları alabilir miyim?
  • System.out.printLer yazdırmak yok java.lang.System.out.print. İç sınıfa yazdırırlar. İlk ikisi (dizeleri basması gereken) hiçbir şey yapmaz; ikinci olan:
  • Bir pencereye çıkar. Örnek çıktı - karekök görüyor musunuz (giriş 100) ?:görüntü tanımını buraya girin
  • Pencere kapandığında hiçbir şey yapmaz. Ne ALT-F4, kapat düğmesini tıklatır, ne de normalde kapanacak bir şey yapmazsa başarısız olur.
  • Pencere her zaman diğer pencerelerin üstündedir. En üst düzeye çıkarılmış olmasıyla birlikte, bu onu kapatmak için biraz düşünmeyi gerektirir.
  • Biz sayıyı doğru sayıya ulaşıncaya kadar sqrt tam sayı eki ile bulur. Tamsayılı sarmayı beklediğimizden bu uzun zaman alıyor. Bu nedenle, daha büyük sayılar için aslında daha az zaman alır. Numune çıkışı için 20 saniye sürdü.
  • Giriş olduğu zaman için düzgün çalışmıyor 0. Giriş negatifse, aynı nedenden dolayı sonsuz döngüde başarısız olur, giriş olduğunda sonsuz döngüde başarısız olur 0.
  • Kendimi trolled ve bu kodlama ve hizalama ~ 2 saat geçirdim.

11
Son derece trolled, iyi efendim.
Kod Whisperer

1
Sanırım JFrame.DO_NOTHING_ON_CLOSEtroller listesinden
çıkmışsınız

2
@PlasmaPower Ben bunu düzenlemek üzereydim. Sen de söylemeyi unuttun setAlwaysOnTop(true).
Justin,

4
"Ben kendimi
trolled

15
@Herjan kız arkadaşı? Hangi kız arkadaşı?
Justin,

71

C ++

Daha iyi bir rotanız yoksa, her zaman kaba kuvvet çözümü vardır:

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;
}

Bir olası her değeri üzerinden bu yineler double(tarafından unionbir ile ing long longkimin kare biridir bulana kadar onları gerçek çiftlerde olarak çiftler kullanılarak aracılığıyla aslında yinelerler için iyi bir yolu yoktur çünkü hangi aynı bit boyut taşımaktadır) n.


12
Şimdi bana merak ettin, ne kadar sıklıkla (koşması için sınırsız zaman verilir) bu gerçekten işe yarıyor ve ne kadar sıklıkla kesin bir eşleşme bulup NaN'e geri dönüyor? 50/50 olduğunu düşünüyorum, ama iyi matematiksel düşünmek için burada çok geç.
Ocaklar

29
Aman Tanrım, a doubleve a birlikteliği long long, gördüğüm en korkunç şey.
Patrick Collins,

10
Belki bu arzu edilir (trolling'in bir parçası), ancak a'nın farklı bölümlerine erişmek uniontanımsız bir davranış ve çiftler arasında yineleme yapmak mümkündürstd::nextafter
Hiç kimse

6
Bana std::nextaftersöylemeden önce var olan hiçbir fikrim yoktu , bu yüzden evet, istendi.
Joe Z.

3
Bazı doubledeğerler çarpılarak elde edilemez x*xnerede xolduğunu doubleda. Dolayısıyla, arama bazen başarılı olmaz (çoğu zaman?), Daha doğru sonuç yerine NaN verir.
Sarge Borsch

64

Python 3

Bu basit kod tam bir cevap verecektir :

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

Sadece girilen sayının önüne bir karakter yazdırır .



24
Öte yandan @JanDvorak, burada her zaman tam cevap verecek tek program bu.
Seviye River St

1
@ steveverrill: Hayır, benim de var.
NaCl,

1
@ steveverrill: Bu programa meydan okudum, her zaman doğru cevabı veren bir program yazdım ve aslında sorunu çözdüm (bu arada benim Python 3 programım, C programı değil).
Konrad Borowski

16
@JanDvorak bu kod trolling olduğunu
TheDoctor

45

Python 3'te aşağıdakileri yapabilirsiniz:

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

38
Trolünü öğrendim: Bu işe yaramıyor. Öyle görünüyor, ama ikinci çizginin girintili olması gerekiyor.
Justin,

7
@DLeh kendini trolling mümkün mü?
krs013

42

Bu cevabı düzeltmek ,

C kullanımı en hızlı olduğundan C kullanımı

Bu sadece düz yanlış. Herkes en hızlı olanın ASM olduğunu bilir.

Saf 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

Diğer geri zekalı cevapların aksine, bu bir O (1) karmaşıklığına sahiptir !
Ve diğer cevapların aksine, bu% 101 kesindir, sqrt(0.5)çünkü verir 0.70710678118655!

Troller:
* Montajda yazım. Montajda hiç kimse yazmıyor
* O (1) olmak çabuk olmuyor. Herhangi bir numaraya sqrt yapmak sistemimde yaklaşık 90 saniye sürüyor.
* Kodlanmış atlama yerleri.
* Yığın çerçeve yok
* AT&T sözdizimi. Bazı insanlar zaten bir trol olduğunu düşünüyor.

Açıklama: IEEE float spesifikasyonuna bakarsanız, çiftlerin ikili temsillerinin sipariş edildiğini, yani a > böyleyse sipariş edildiğini fark edebilirsiniz *(long long *)&a > *(long long *)&b.
Bu hileyi kullanıyoruz ve her defasında FPU'yu karıştırarak ve argümanla CPU karşılaştırması yaparken cevabın yüksek dword'ünü tekrarlıyoruz.
Sonra da alt dword üzerinde yineliyoruz.
Bu bize neredeyse sabit bir hesaplama sayısında kesin bir cevap buluyor.


5
Düzeltmenizin düzeltilmesi: C, derlemeden daha hızlıdır, çünkü derleyici insandan daha iyisini optimize edebilir. Her bir x86 montaj işlemini bilmiyorsanız, derleyici genellikle daha iyi kod yazacaktır.
Konrad Borowski

30
@xfix Düzeltmenizin düzeltilmesi: elinizde bir intel manual ile, bir insan
GCC'den

6
@ xfix Her anımsatıcı için kısa açıklamaları okuduktan sonra, PCMPEQQartık size "derleyici tarafından üretilen sihirli okunamayan çöpler" olarak
görünmüyor

1
Vay, keşke laboratuar ortağım olsaydın, montajda ne yaptığım hakkında hiçbir fikrim yok. Komik cevap / yorum.
HC_

@mniip (Düzeltmenizin düzeltilmesi) ^ 3: Bir süperişlemci en uygun kodu bulabilir (her türlü talimat dizisini deneyerek) ve bir insandan daha iyi bir performans sergileyebilir ^ _ ^ Kesinlikle herhangi bir karekökte yerleşik olmalıdır?
Navin

39

piton

"Sayı karekökü oluşturacak" bir işlev veya program yazın.

Sınıfınıza girmesine izin verilirse, burada karmaşık bir matematik kütüphanesini yardımcı olarak kullanabilirsiniz, komutu çalıştırarak kurun:

pip install num2words

Sonra sadece bu python betiği gibi bir şey çalıştırmak istiyorsunuz:

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')

(Bunu yönetici ayrıcalıklarıyla çalıştırdığınızdan emin olun)


Bunun nasıl yürüdüğünü açıklayabilir misiniz?
Şapkalı Adam

6
@ TheGuywithTheHat: Bir sayının karekökünü vermek yerine, bu çözüm sayının karesiyle adlandırılmış bir kullanıcı yaratır ve bu kullanıcıyı bir yönetici ( rootUnixland'da) yapar.
3Doubloons

33

C

Açıkçası bu en iyi yoldur. Koda bakarak hayal edebileceğiniz kadar hızlı. C kullanımı, çünkü C en hızlıdır ve bu problem hızlı bir çözüm gerektirir. Bunu 7, 13 ve 42 gibi en sevdiğim numaralar için test ettim ve çalışıyor gibi görünüyor.

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
Bence demek results[number];istiyorsun
ace_HongKongIndependence

31
@ ace: Her iki çalışmada da, sadece buraya daha fazla şaşırtma koymak tercih ettim. Bu sözdiziminin C de neden geçerli olduğunu öğrenmek için lütfen stackoverflow.com/q/381542/736054 adresini ziyaret edin.
Konrad Borowski

8
@ArlaudPierre Bu gibi kod trolling çözümleri güzelliği budur. Onlar gerçekten kullanılabilir olduklarını düşünmek için sizi kandırabilecek belli bir aralık için uygunlar!
Bay Lister,

2
@MrLister Bunlar şunlardır aslında kullanışlı. Soru, hangi değer aralığının kabul edildiğini söylemez. Bunun kesinlikle kabul edilebilir bir değer olduğu bağlamlar olabilir.
Pierre Arlaud

9
@ArlaudPierre: Kodumda başka bir iyi gizlenmiş trol var. Bazı değerler geçersiz, ancak kimsenin farkına varamayacağı bir durum (özellikle de sırayla oldukları için). Ve sonra insanlar başka bir Pentium FDIV böceği hakkında şikayet edeceklerdi.
Konrad Borowski

30

C

Püf noktaları ve sihirler onu çalıştıracak.

#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;
}

Bu oluyor hızlı karekökünü ters .


7
Birinin bunu yapacağını biliyordum :) Bu, gerçek sihirin neye benzediğini gösteriyor
qwr

8
1 / y'yi ters kökten gerçek kök haline getirmek için neredeyse bir dakika geçirdim. Return x * y kullanmanın alternatifi doğrudur, ancak tespit edilmesi daha zordur.
Seviye River St

1
10 yinelemenin çok fazla olduğunu düşünüyorum. 2-3 genellikle yeterlidir.
njzk2

1
@ njzk2 aslında Quake 3 motorunda sadece bir yineleme kullanıldı. İkincisi "bu kaldırılabilir" ek notu ile yorumlandı. codemaestro.com/reviews/9
Dunno

29

Python 3

Sizler her şeyi yanlış yapıyorsunuz. Herkes 20'nin karekökünün 4.47213595499958, hatta √20 olmadığını görebilir. Bu çözüm, karekök hesaplama zor görevini bu amaç için amaçlanan modüle kaydırır.

Bu tür modüllerden biri karekök matematiği sağlayan semboldür. Buradaki diğer çözümlerin aksine, aslında her şeyi düzgün bir şekilde yapıyor. Sqrt (-1) değerinin I olduğu varsayılmaktadır - buradaki hiçbir çözüm bunu çözemez.

Ve işte modüler kod, işte programların nasıl göründüğü. İşlevler mümkün değilse küçük olmalıdır, eğer değilse, korkunç programlar yazdığınız anlamına gelir. Ayrıca, programların çok fazla yorumu olmalı.

#!/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

Ve işte bu programın çalışmasına bir örnek.

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

12
-1 Yetersiz yorum
alexwlchan

5
@alexwlchan: Daha fazla yorum ekledi.
Konrad Borowski

2
Bunlar gerçekten kısa, anlaşılması kolay, açıklayıcı fonksiyon isimleri! 1! PS Daha fazla yorum ekledi.
AMK

2
-1 fonksiyon ismi yeterince uzun olmamalıdır 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.
Şapkalı Adam

1
@TheGuywithTheHat: Büyük fonksiyon isimlerimin yatay kaydırma olmadan kod kutusuna sığmasını tercih ederim. Kod denetimi olsa bile , kaydırma işleminden nefret ediyorum.
Konrad Borowski

28

JavaScript

Ne yazık ki, JavaScript fonksiyon isimleri için karekök sembolünü desteklememektedir. Bunun yerine, karekök işlevini temsil etmek için başka bir Unicode alfabe karakteri kullanabiliriz.

Bu örnekte kullanacağım .

Kullanılacak geçerli bir sembolümüz olduğunda, Math nesnesini karekök fonksiyonu oluşturmak için kullanabiliriz.

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

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

Basit! :)

Tabii ki, sadece kullanmak daha kolay olurdu var ᕂ = Math.sqrt;


16
Kodunuzun JS kompresörlerini kırma şeklini seviyorum.
Konrad Borowski

2
@xfix Evet, eğer bir şey kendiliğinden çalışan işlevin adını değiştirmeye çalışırsa, kod kırılacak :)
nderscore

25

Julia

Açıkçası bunu yapmanın en iyi yolu, onun karekök Taylor Serisi kullanarak:

görüntü tanımını buraya girin

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

Bu aslında çok kesin değerler veriyor:

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

Fakat elbette bir yaklaşım gibi (ve aynı zamanda yakınsak bir seri olmak), 1'e yakın olmayan değerler için işe yaramaz:

julia> sqroot(0)  #what?
9.659961241569848

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

2
Bu güç serisinin yakınsak yarıçapı 1'dir, bu nedenle bu sadece (0,2) t (veya yarıçapı 1'in merkezindeki açık diskteki karmaşık t için) için çalışır. Diğer değerler için çarpanlara ayırma kullanabilirsiniz ...
gniourf_gniourf

Haklısın, sadece
ÇKP

2
İsteğim için çok faydalı. Sınırlara gelinceye kadar 4 ile kolayca bölebilirsiniz, ardından sonucu karşılık gelen 2 gücüyle çarpın.
user19713

1
^ Ortalama tembel soru-sorunuzun olduğu gibi kabul edileceğini söylemenin güvenli olduğunu düşünüyorum.
Joe Z.

Bence Taylor Serisinin yerinden çıkmış ve 1 ortalanmış olduğu gerçeğini kaçırıyorsunuz, bu yüzden a^2(n kere) bölüp (n kere) çarparak acevap ( sqrt(x)~a^n*sqroot(x/a^2n)) x-> 0 (eğer bir> 0) 'ı 1' e çarpmayın. (büyük hatalar vermek). Ayrıca eğer x / a ^ 2n ~ 1 ise rakamlar a!=xve istenilen sınava girme nkeyfi xiçin değişecek (onları bulmak can sıkıcı ve zaman alıcı).
ÇKP

20

Lateks

Bunun için çözüm oldukça zor ve çok karmaşık, bu yüzden kahvenizi alın. Sorun şu ki, kodun karekökünün ne tür bir numara istediğine bağlı olarak önemli ölçüde değişmesidir. Sana sorunu göstereceğim. Diyelim ki 9bu senin numaran. Sonra kod şöyle görünürdü:

\sqrt{9}

Şimdi 1234321numaranızın bu olduğunu söyleyelim , koda bakın:

\sqrt{1234321}

Son fakat en az değil, numaranızın olduğunu söyleyelim 0.

\sqrt{0}

Bunu çözmek için iyi bir yol bir program yazmaktır Ook!ya PietNumaranızı istiyor ve çıkış verdiğinde, LaTeX-sqrt-codebunun için. Burada sadece bir bayt okuyabildiği ve bu baytın yasal bir sayı olup olmadığını kontrol etmediği için çok basit bir örnek var Ook!, ama sanırım o noktaya varacaksınız.

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! 

İçin aynı Piet:

Ook ile yazılmış basit bir programla aynı mı!

Bu en etkili yol olurdu. Ayrıca Piether zaman güzel bir sanat eseri olduğu için kullanmanızı öneririm , bu yüzden işler çok sıkıcı olmaz.


3
Bu Piet kodunu isterdim, ancak Ook kodunu çalıştıran sadece bir Brainfuck derleyicisi (internette bulabildiğim).
Konrad Borowski

11
Bir saniye bekle? Üçüncü bir dili ayrıştırmak için başka bir dilin derleyicisini çalıştıran bir esolang programı mı? Ah oğlum!
Kroltan

Ook sadece Brainfuck'taki kelimeden oluşan bir parıltı.
Ross Presser

20

Haskell

Kayan nokta hatalarını ilk duyduğumda bilgisayarlara güvenmeyi bıraktım. Cidden, Google bile kontrol altına alamazsa , kim yapabilir?

Bu yüzden en iyi seçeneğimiz sadece tamsayıları içeren bir çözüm bulmak. Neyse ki bu kolay, çünkü tüm sayıları kontrol edebiliyoruz, çünkü her aralık [1.nn] aleph-1 realleri gibi değil, sadece sınırlı bir miktar içerir. Haskell'de örnek bir uygulama:

import Prelude hiding (sqrt)
import Data.List

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

Bir cazibe gibi çalışır, bir göz atın:

λ> sqrt 8
2

Doğruluk çoğu uygulama için yeterli olmalıdır.



2
"Bok aleph-1 reals" için
+1.0

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

1
@AMK Huh. Belki Google doubles kullanıyor ve DDG triples kullanıyor .
wchargin

16

Java

Bunu yapmanın en kesin yolu yinelemektir. Önce, integerhedefin üzerinden geçene kadar s ile döngü yapın , sonra doubles'ye geçin . Bu yöntem, görebileceğiniz diğer "tahmin" yöntemlerinden farklı olarak, kesin olma avantajına sahiptir . Biraz hız feda edersiniz, ancak çoğu uygulama için tam olarak ihtiyacınız olan şey budur.

Ne kadar hassas olmanız gerektiğine bağlı olarak bu cevabı değiştirebilirsiniz, ancak bu en azından milyarıncı için çalışmalıdır:

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;
}

Bu sqrt(99.9999998);benim için yapmak için yaklaşık 3 saniye sürer . Bir milyar dolara kadar (iki katına) dolamak sanırım biraz zaman alıyor.


1
Kullanmanın sorunu, 0.000000001yuvarlama hatalarına eğilimli olmasıdır. C ++ ile daha kesin bir çözüm yarattım .
Joe Z.

2
@JoeZ. Evet, + 1'imi aldım, ama bu devlet işleri için yeterince iyi. Elbette, sizinki
NaN'i

Doğru. Buraya epsilon tespitini yapmalı mıyım?
Joe Z.

3
Neden Math.nextUp(root)yerine yapmıyorsun +0.000000001? Bu daha uzun sürecek ... ve başarılı olması garantili.
Justin,

1
@ Quincunx Bunu yapan ve bulamadığımda şaşırtan bir yöntem olduğunu düşündümDouble . Bakmayı düşünmedim Math, ama bu oldukça iyi çalışıyor. Henüz hiçbir şeyde "başarısız" olmadı.
Geobits

11

JavaScript

Bu sihirli sabitler, bir sayının karekökünü alfabeyi kullanarak hesaplamak için kullanılabilir:

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+'';
}

Testler:

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

Çok iyi çalışıyor gibi görünüyor. Acaba daha kısa bir yol var mı?

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


10

JavaScript

Çok zor bir problem!
Bunun JavaScript'te yerleşik bir işlevi yoktur ...
Newton-Raphson çözücü için bir işe benziyor.

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;
}

Şimdi kullanabilirsiniz Math.sqrt


Bu nasıl troll? Olumsuz bir cevap verdiği gerçeği mi?
Joe Z.

1
@JoeZ. Yeni başlayanlar için bir ev ödevi için Newton-Raphson çözücü kullanmak trol. Beklenen cevap değil, işe yarıyor ve biraz zaman harcayarak kodu anlamaya çalışıyor.
Michael M.,

28
-1 yeterli değil jQuery.
Pierre Arlaud

5
@ArlaudPierre Umarım bir -1
vermemişsindir

@tomsmeding O yapmadı.
Justin

10

JavaScript / ActionScript

ActionScript veya JavaScript'te doğrudan bir kare kökü hesaplamanın bir yolu yoktur , ancak bir geçici çözüm yoktur. Bir sayının karekökünü 1/2güce yükselterek alabilirsiniz .

JavaScript ve ActionScript 2'de nasıl göründüğü:

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

İşlev ActionScript 3'te de aynı şekilde çalışsa da, açıklık ve güvenilirlik için yazılan değişkenleri ve dönüş değerlerini kullanmanızı öneririm:

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

Trol:

Her ne kadar num^(1/2)karekök ile sonuçlanacağıma dair matematikte doğruysa da, ^operatörün aslında JavaScript'te ve ActionScript'te Bitwise XOR'da yaptığı şey doğru .


1
Oradaki en iyi cevap. 'güç' operatörünü beğendim
Silviu Burcea

Bu cevap, C veya Python2 de, ek olarak anlam ifade eder 1/2 == 0.
aland


9

PHP (ve diğerleri):

Sorunun tarif edilme şekli aslında onu hesaplamamız gerektiği anlamına gelmediğinden, işte çözümüm:

<?
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);
?>

Birden çok dilde karekökü doğru bir şekilde hesaplamak için bir yol sağlar.

Dillerin listesi genişletilebilir.

Bu değer POST, GET, bir çerez üzerinden gönderilebilir ve hatta oturuma kaydedilebilir.

Eğer sadece sayıyı verirseniz, kafanız karışır ve hesaplanan sonucu verir, bu (neredeyse) HER dil için geçerlidir !


8

C

Bu, diğer tüm 27 cevaptan daha iyidir, çünkü hepsi yanlış. Bu doğru, 2 olması gerektiğinde yalnızca bir cevap veriyorlar. Bu yanlış olacaksa cevap vermeye bile çalışmıyor, sadece vazgeçip aşağı yuvarlanıyor.

#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;
;}

Kod-trolling:

  • Çok garip adlandırma
  • fordöngü kötüye kullanımı
  • Noktalı virgülleri satırın başına
  • #defineiçin kullanmak artırmak azalma okunabilirliği
  • yararsız kullanım mesajı
  • eksi veya artı yerine eksi veya artı
  • bir dize döndürür
  • yerel bir değişken döndürür
  • 4 derleyici uyarısı (2 kullanılmamış ifade sonucu, printf dizgesinde değil, yerel değişken adresini döndürerek)
  • sadece <100 olmayan (0, 4, 9, 16, 25, 36, 49, 64 ve 81) negatif olmayan mükemmel kareler için çalışır, çünkü cevap sadece 1 basamak olabilir (cevap kesinlikle sebepsiz bir şekilde yazdırıldıktan sonra geri basılır). , bu nedenle, örneğin , yalnızca düz olan √1024geri dönüşler 3√1024 = ∓32)

#define the number... Güzel! Özellikle kullanım mesajını gösterme koşulu hakkındaki düşünceni beğendim.
CompuChip

-1, çünkü 2 milyardan fazla komut satırı parametresi girersem kullanım mesajı görüntülenir. Veya PDP-11 gibi 16-bit bir makinede çalıştırıyorsam belki 32768'lik bir tanesi. (İşte, bu bana çıkıyor). Her ikisi de aslında mümkün değildir, çünkü her iki durumda da, ana çağrıya bakmadığı ve basitçe size yalan söylenmediği sürece mimarlık bu kadar çok parametreye girmeyi yasaklar. Bu imkansız değil: Bunu yapabilirim. Gerçekten, sana zaten yalan söylemiş olabilirim.
ClickRick

8

C ++

http://en.wikipedia.org/wiki/Fast_inverse_square_root ve @ snack'nin cevabına dayanarak .

X ^ (- 0.5) 'ı x ^ (0.5)' e dönüştürecek şekilde cıvatalama yapmak yerine, doğrudan algoritmayı değiştirdim.

ALGORITMASı

Bir tam sayıya (bu durumda uzun süredir) bir kayan nokta sayısı (bu durumda bir çift) kullanın .

Kayan nokta sayısının ilk birkaç biti üsteldir: yani sayı 2 ^ AAA * 1.BBBBBBB olarak saklanır. Öyleyse bir hak değiştirme yapın ve bu üs yarıya indirildi.

Orijinal ters karekökünde, bu sayı karşılıklıyı vermek için sabitden çıkarıldı. Sadece sabite ekliyorum çünkü karekökü doğrudan istiyorum. Sabitin değeri istenen değere en iyi yaklaşım olan bir cevap verecek şekilde seçilir.

Numarayı tekrar kayan noktaya çevirin.

İsteğe bağlı olarak, bir veya iki Newton'ın yönteminin yinelemesi sonucu iyileştirmek için kullanılabilir, ancak rahatsız etmedim, çünkü onsuz ne kadar yaklaşabileceğimi görmek istedim.

Kullanılan sabitler çok gizemli görünüyor, ancak ilk birkaç rakamın ötesinde, değerler kritik değil. Deneme ve yanılma ile sabiti buldum. Bazen küçümsenen, bazen aşırı küçülenen bir değer elde ettiğimde durdum.

#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;
}

Sonuçlar

Döküm sadece gereklidir, çünkü C bir şamandırada bitshift işlemleri yapmanıza izin vermez, bu nedenle tek gerçek işlemler bitshift ve eklemedir. Sonucu geliştirmek için tek bir Newton yönteminin yinelemesini kullanmadım, bu yüzden hassasiyet dikkat çekici. OP'nin öğretmeni, (açıkçası) birçok amaç için yeterince doğru olan yöntemin hızından etkilenecek!

görüntü tanımını buraya girin


Süper doğru kayan nokta
Cole Johnson

2
@ColeJohnson Peki, kesin bir çıktınız olamaz, bu bilgisayar dünyasının bir kısıtlamasıdır (sonsuz belleğe sahip olamayız). Yani bunun olabildiğince doğru olduğunu söyleyebilirim.
Pierre Arlaud

Eh, çift açıkça overkill ve trolün bir parçası. Bu yöntemden yaklaşık olarak +/-% 30 elde etmem bekleniyordu. Trolling, ne kadar doğru olduğuna şaşırdım. Sebep bir kısmı şudur: 4 = 2 ^ 10* 1. 000, sqrt (4) = 2 ^ 01* 1. 000= 2, sqrt (2) = 2 ^ 00* 1. 100= 1.5. Bu yüzden 1üs dışına kaydırılan bit, 1.5 değerinde bir mantis verir, ki bu da yaklaşık 1.4 olan sqrt (2) değerinin gerisinde kalmaz. Ancak nasıl tutarlı bir şekilde% 3'ten daha iyi bir doğrulukla cevap verdiğine dair hiçbir fikrim yok.
Seviye River St

7

E

Not: Bu sadece temel donanım görünen gibi o, ikilik sistemde ancak baz e sayıları saklamaz olarak, bilgisayarımda çalışır 10e temsil 100e temsil e , vb. Bu şekilde, bir ikili makinede sola bir bit kayması yapabilecekleriniz x => e x gerçekleştirir ve bir ikili makinede sağa bir bit kayması yapabilecekleriniz x => ln x gerçekleştirir. Açıkçası, bu çok sınırlı, ikili merkezli internet ortamında onun altında yatan sayıları göstermek zor, ama elimden gelenin en iyisini yapıyorum.

E'nin sözdizimi, C / C ++ dizisine oldukça benzerdir, bu nedenle çoğu insanın anlaması için kolay olmalıdır.

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

7
Bu gerçek bir dil mi?
Joe Z.

Ne tür bir bilgisayar kullanıyorsunuz?
Cole Johnson

@ClickRick E programlama sözdizimi ve komut şeması için bir bağlantı sağlama şansınız var mı?
WallyWest

6
Üzgünüz, ama e üssünde bile n >> 1olduğu gibi değil log(n).
jwg

2
Dil, anlaşılacak kadar kolaydır. Destekleyici donanımın varlığı sorgulamanız gereken bölümdür.
ClickRick

6

JavaScript / HTML / CSS

JQuery ve kimlikleri biraz daha troll yapmak için kullanmayı düşündüm, ama vanilya js tercih ediyorum.

Sonuç tam olarak kesin değil, ama çalışıyor!

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

GeoGebra

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

Cevabınızın değerini koordinat ekseninden okuyun.


Burada çevrimiçi deneyin (Java gerektirir) veya aşağıdaki ekran görüntülerinin keyfini çıkarın:

görüntü tanımını buraya girin görüntü tanımını buraya girin


6

% 100 saf (tamsayı esaslı)

Bilimsel sanat sunumu ile:

Bu mükemmel kök karenin sourcekomut kullanılarak bash ile kaynaklanması gerekir.

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}",$'!     !',+-----+};}

Eski (bu sürüm basitçe herhangi bir konsol terminaline yapıştırılabilir)

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',+-----+}
}

Gibi çalışacak:

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!
                                   !     !
                                   +-----+

Lütfen dikkat: Kök kare !!


4

Java

Teşekkürler, ggmx'in java'da pi'nin n basamağını oluşturduğu kod için .

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);
    }
}

Girdiyi uygulamak gibi hissetmedim. Kod değişikliğini test etmek sqrtThisve expectedPercision.

İşte kod nasıl çalışıyor. Öncelikle, tamsayı için sqrt kökünü elde etmek önemsizdir, bu yüzden bunu uygulamak istemedim ve bunun yerine sqrt fcn'de yerleşik java'ları kullandım. Yine de kodun geri kalanı% 100 okunaklı.

Temel fikir, pi sonsuz uzunluğa sahip olmayan tekrarlayan bir ondalık sayı olduğundan, tüm sayı dizilerinin içinde gerçekleşmesi gerekir. (düzenlemeyi oku). Bunun için cevabınız pi içinde! Gibi biz sadece sizin için cevap pi arama üzerinde bir regex arama uygulayabilirsiniz. İyi bir cevap bulamazsak, aradığımız pi boyutunu iki katına çıkarırız!

Gerçekten kolay, aslında biri pi kadar kolay olduğunu söyleyebilirdi :)

Düzenleme
Pi'nin içinde her sonlu sayılar dizisini içerdiği kanıtlanmamıştır. Pi'nin sonsuz ve tekrar etmemesi gerçeği, Exelian'ın kanıtladığı gibi ifade için yeterli kanıt değildir. Ancak birçok matematikçi, pi'nin sonlu sayıların her bir dizisini içerdiğine inanmaktadır.


Sonsuz ve yinelenmeyen olmanın her sekansın bir sayıya çıkmadığını not etmek isterim. Sonsuz ve yinelenmeyen bir sayı oluşturmak oldukça kolaydır ancak içinde mümkün olan her sekansa sahip değildir, örneğin 0.1011001110001111 ... Bunun nitpicky olduğunu biliyorum, ancak insanlar genellikle bu argümanı yanlış kullanırlar (pi muhtemelen her mümkün olanı içerir) dizisi olsa da, kesin olarak bilmiyoruz)
Exelian

@Exelian, yorumunuza göre bir düzeltme yaptı, hem yorumunuzu hem de çözümümün neden hala yeterli olduğunu gösteren bir bağlantı sağladı.
Sahar Rabinoviz,

3

JQuery

bu en doğru olanı (bonus: ayrıca harfler için de işe yarar!)

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

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

İşte bir keman


3
Mücadeleyi kelimenin tam anlamıyla çok almak da komik değil. Her ne document.writekadar yeterli olduğunu sanmıyorum .
John Dvorak

2
@JanDvorak bu bir kod trolling, bu tür çözümler burada geçerlidir.
Mhmd

3
@Mhmd: Yine de, burada yaratıcı olmanızı bekliyoruz. Bunu zaten herkes yaptı, başka bir şey yap. Bu şekilde fazla oy alamazsın.
Konrad Borowski

1
@ JanDvorak / xfix: Sorun, asgari kriterleri yerine getirirken hala cevabın kalitesinin düşük olması durumunda, cevabın sadece puanla dibe çökmesine izin vermenin çözümü değil mi? (Bu, bağlantınıza göre zaten çoktan
affedilmiş

1
@JanDvorak: İyi nokta. Bunu göz önünde bulundurarak, açıklama için teşekkürler!
Andrew Coonce

3

C ++

Bu sonuçta size bir kare kök alır.

#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;
}

Soruyu daha iyi yansıtacak şekilde kodu düzelttim. Önerileriniz için teşekkür ederiz ... kodu güncellendi.


Zaten makine epsilonuyla sınırlı olduğunuzdan neden kullanmıyorsunuz x+=1e-16?
Kyle Kanos

1
@KyleKanos Veya daha doğru DBL_EPSILON.
Cole Johnson

3

piton

Bu çözüm:

  1. deterministik değildir ve yaklaşık cevaplar verir
  2. O (N) ve oldukça yavaş, düşük N için bile
  3. belirsiz bir matematiksel ilişkiye dayanır

Bir şeyin önceden reklamı:

Toplam N bağımsız üniforma [-.5, .5] rasgele değişkenleri. Mutlak değerlerin ortalamasını alarak standart sapmayı tahmin edin. Olduğu gibi, standart sapma N -> \ infty olarak sqrt (N) ile orantılıdır. 139 ve 2.71828, kesinliği kontrol eden ölçek faktörleridir ve gizemli görünmeleri için seçilmiştir.

Kod:

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 ++

Sorunuz derlenmedi çünkü siz koydunuz! sonunda. C ++ sevmiyor!
İşte derleyici için doğru soru:

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

Oh .. ve makyaj dosyası.

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

ve 26317.def. Bu, derleyicinizde zaten mevcut olmalı

#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 

Evet, birileri doğru önişleme cevabını vermek için -E kullanabilir, ancak -E biliyorsanız, nasıl kare kök yapılacağını da bilirsiniz. : P İşte bazı önceden işlenmiş. Çok düşük minimal çözüm, sınır kontrolü yok, isteme yok. Bu trigrafı önceden işlenmiş.

# 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;}
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.