Membantu!! Bagaimana melakukan root kuadrat! [Tutup]

42

Hai teman-teman, untuk kelas saya, saya perlu membuat nomor akar kuadrat tetapi tidak berhasil !!

Tantangan:

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

Catatan: Ini adalah kode trolling. Berikan jawaban "berguna" untuk memandu programmer baru ini dalam perjalanannya menuju kesuksesan pemrograman! Jadilah kreatif!

qwr
sumber
63
@CloseVoters Harap hentikan pemungutan suara untuk menutup [kode-trolling] sebagai off topic karena kurangnya kriteria kemenangan. Dalam hal ini, ini jelas merupakan [kontes popularitas]. Edit jika Anda mau. Hanya karena Anda tidak suka [kode-trolling] tidak berarti Anda harus menutup tantangan untuk orang lain. Jelas, banyak orang menyukai jenis tantangan ini, dibuktikan dengan jumlah jawaban, jadi, karena SE adalah situs berbasis komunitas , biarkan terbuka untuk orang-orang ini.
Justin
12
@ Quincunx Sebagai catatan, suara saya untuk Too Broad. Tidak ada yang bisa dilakukan kecuali "membuat sesuatu yang berhubungan dengan akar kuadrat." (Sebagaimana dibuktikan dengan sudah ada lima belas jawaban.)
Gagang Pintu
7
Close-voters: Dapatkah Anda membantu saya memahami bagaimana ini lebih "luas" daripada pertanyaan [code-trolling] lain yang tidak tertutup ? Mungkin ada alasan dekat yang valid di sini, tetapi kategori kode-troll secara alami akan menjadi sedikit lebih luas daripada kebanyakan tantangan. Kalau tidak, itu agak akan mengalahkan tujuan.
Geobits
6
@ Geobits, dengan mengatakan bahwa jawabannya bahkan tidak harus benar, ini seluas "Tulis beberapa kode".
Peter Taylor
11
@ Gareth Ini analogi yang menarik, tetapi tidak cocok dengan komentar aslinya. Anda dipersilakan untuk berdiri di luar McDonalds sepanjang hari dengan spanduk yang memberi tahu orang-orang bahwa makanannya jelek. Dan Anda dipersilakan untuk menurunkan / memberikan komentar negatif pada pertanyaan ini. Namun jika Anda mencoba untuk secara fisik menghentikan orang dari memasuki McDonalds (setara dengan putaran kedua pemungutan suara tertutup, yang baru saja dimulai) Anda kemungkinan besar akan ditangkap. Saya punya beberapa simpati dengan penyebab anti-kode trolling dan saya tidak akan upvoting (atau downvoting) pertanyaan ini. Tetapi saya ingin kebebasan untuk mengirim jawaban jika saya punya jawaban.
Level River St

Jawaban:

121

Jawa

Wow, ini masalah yang rumit. Saya belum pernah melakukan root kuadrat sebelumnya. Saya telah mengambil akar kuadrat, tetapi saya belum melakukannya. Jangan lupa untuk membuat kode Anda terlihat cantik untuk kredit tambahan di kelas Anda. Berikut kode yang membuat akar kuadrat dari angka yang dimasukkan:

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

Troll:

  • Jelas, kode tersebut dikaburkan.
    • Apakah saya mendapatkan poin bonus untuk seni dalam kode?
  • The System.out.prints tidak mencetak ke java.lang.System.out.print. Mereka mencetak ke kelas batin. Dua yang pertama (yang seharusnya mencetak string) tidak melakukan apa-apa; yang kedua:
  • Keluaran ke jendela. Output sampel - apakah Anda melihat akar kuadrat (inputnya 100) ?:masukkan deskripsi gambar di sini
  • Jendela tidak melakukan apa-apa saat tutup. Baik ALT-F4, mengklik tombol tutup, atau melakukan sesuatu yang biasanya menutupnya gagal.
  • Jendela selalu di atas jendela lain. Dikombinasikan dengan fakta bahwa itu dimaksimalkan, ini membutuhkan sedikit pemikiran untuk menutupnya.
  • menemukan sqrt by integer ADDITION dari angka hingga kami mencapai angka yang benar. Ini membutuhkan waktu yang lama karena kami menunggu pembungkus bilangan bulat. Karena itu, sebenarnya membutuhkan waktu lebih sedikit untuk angka yang lebih besar. Untuk output sampel, butuh 20 detik.
  • Tidak berfungsi dengan benar ketika inputnya 0. Gagal oleh loop tak terbatas ketika input negatif karena alasan yang sama gagal oleh loop tak terbatas ketika input 0.
  • Saya mengendalikan diri dan menghabiskan ~ 2 jam mengkodekan ini dan menyelaraskannya.
Justin
sumber
11
Sangat baik dikendalikan, tuan baik.
Code Whisperer
1
Saya pikir Anda meninggalkan JFrame.DO_NOTHING_ON_CLOSEdalam daftar troll ...
PlasmaPower
2
@PlasmaPower saya akan mengeditnya. Anda lupa menyebutkannya setAlwaysOnTop(true)juga.
Justin
4
"Aku mengendalikan diriku" Kupikir kau juga
mengendalikan
15
@ Pacar Herjan? Pacar apa?
Justin
71

C ++

Nah, jika Anda tidak memiliki rute yang lebih baik, selalu ada solusi brute-force:

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

Ini iterate melalui setiap nilai yang mungkin dari double(dengan unionitu dengan long longyang dari ukuran bit yang sama, karena tidak ada cara yang baik untuk benar-benar iterate melalui mereka menggunakan ganda sebagai ganda aktual) sampai menemukan satu yang persegi n.

Joe Z.
sumber
12
Sekarang Anda membuat saya bertanya-tanya, seberapa sering (diberikan waktu tanpa batas untuk menjalankan) apakah ini benar-benar berfungsi, dan seberapa sering gagal menemukan kecocokan yang tepat dan mengembalikan NaN? Saya pikir ini tentang 50/50, tapi terlambat di sini untuk berpikir matematis yang baik.
hobbs
29
Ya Tuhan persatuan a doubledan a long longadalah hal paling menakutkan yang pernah saya lihat.
Patrick Collins
10
Mungkin ini diinginkan (bagian dari trolling) tetapi mengakses bagian yang berbeda dari unionperilaku tidak terdefinisi dan melakukan iterasi melalui dobel dimungkinkan dengan fungsistd::nextafter
Nobody
6
Saya tidak tahu yang std::nextafterada sebelum Anda hanya menyebutkannya kepada saya, jadi ya, itu diinginkan.
Joe Z.
3
Beberapa doublenilai-nilai tidak dapat diproduksi dari mengalikan x*xmana xadalah doublejuga. Jadi pencarian tidak akan berhasil kadang-kadang (sebagian besar kali?), Memberikan NaN daripada hasil yang lebih benar.
Sarge Borsch
64

Python 3

Kode sederhana ini akan memberikan jawaban yang tepat :

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

Itu hanya mencetak karakter di depan nomor yang dimasukkan.

dan04
sumber
24
@JanDvorak di sisi lain, ini adalah satu-satunya program di sini yang akan selalu memberikan jawaban yang tepat.
Level River St
1
@steveverrill: Tidak, punyaku juga.
NaCl
1
@steveverrill: Saya menantang program ini, saya menulis sebuah program yang selalu memberikan jawaban yang benar, dan benar-benar menyelesaikan masalah (ini adalah program Python 3 saya, bukan program C, omong-omong).
Konrad Borowski
16
@JanDvorak ini adalah kode-trolling
TheDoctor
45

Di Python 3 Anda dapat melakukan hal berikut:

def square_root(n):
return float(n)**0.5
jamierocks
sumber
38
Saya menemukan troll Anda: Ini tidak berhasil. Sepertinya memang demikian, tetapi baris kedua perlu diindentasi.
Justin
7
@ David apakah mungkin dia mengendalikan dirinya sendiri?
krs013
42

Memperbaiki jawaban ini ,

Menggunakan C, karena C paling cepat

Itu salah sekali. Semua orang tahu bahwa yang tercepat adalah ASM.

ASM x86_64 murni!

.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

Tidak seperti jawaban terbelakang lainnya, jawaban ini memiliki kompleksitas O (1)!
Dan juga tidak seperti jawaban lain, ini 101% tepat, karena sqrt(0.5)memberi 0.70710678118655!

Troll:
* Menulis dalam pertemuan. Tidak ada yang menulis dalam pertemuan
* Menjadi O (1) tidak membuatnya cepat. Butuh sekitar 90 detik pada sistem saya untuk melakukan sqrt pada nomor apa pun.
* Lokasi lompat Hardcoded.
* Tidak ada tumpukan bingkai
* AT&T sintaks. Beberapa orang menganggapnya sebagai troll.

Penjelasan: Jika Anda melihat spesifikasi float IEEE, Anda mungkin memperhatikan bahwa representasi biner dari perintah ganda, yaitu, jika a > bdemikian *(long long *)&a > *(long long *)&b.
Kami menggunakan trik ini, dan beralih ke kata kunci jawaban, setiap kali FPU mengkuadratkannya dan melakukan perbandingan CPU dengan argumen.
Lalu kita beralih ke kata yang lebih rendah juga.
Ini menemukan kami jawaban yang tepat tepat dalam jumlah perhitungan yang hampir konstan.

mniip
sumber
5
Mengoreksi koreksi Anda: C lebih cepat daripada perakitan, karena kompiler dapat mengoptimalkan lebih baik daripada manusia. Kecuali Anda tahu setiap operasi perakitan x86, kompiler umumnya akan menulis kode yang lebih baik.
Konrad Borowski
30
@xfix Mengoreksi koreksi Anda: dengan manual intel, manusia dapat menghasilkan perakitan yang lebih efisien daripada GCC
mniip
6
@xfix Setelah Anda membaca deskripsi singkat untuk setiap mnemonik, hal-hal seperti PCMPEQQtidak lagi tampak oleh Anda sebagai "sampah ajaib yang tidak dapat dibaca yang dihasilkan oleh kompiler"
mniip
1
Wow saya berharap Anda adalah mitra lab saya, saya tidak tahu apa yang saya lakukan di pertemuan. Jawaban / komentar lucu.
HC_
@ mniip (Mengoreksi koreksi Anda) ^ 3: Seorang superoptimizer dapat menemukan kode optimal (dengan mencoba setiap seri instruksi yang mungkin) dan mengungguli manusia ^ _ ^ Tentunya yang harus ada di built-in untuk setiap root rooter?
Navin
39

Python

Tulis fungsi atau program yang akan "membuat nomor akar kuadrat".

Jika diizinkan di kelas Anda, Anda dapat menggunakan perpustakaan matematika yang kompleks sebagai penolong di sini, instal dengan menjalankan perintah:

pip install num2words

Maka Anda hanya akan menjalankan sesuatu seperti skrip python ini:

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

(Pastikan Anda menjalankannya dengan hak admin)

nvuono
sumber
Bisakah Anda jelaskan bagaimana ini menjebak?
The Guy with The Hat
6
@TheGuywithTheHat: Alih-alih memberikan akar kuadrat dari angka, solusi ini menciptakan pengguna yang diberi nama dengan kuadrat angka dan menjadikan pengguna itu admin ( rootdi Unixland).
3Doubloons
33

C

Jelas ini adalah cara terbaik. Ini secepat yang dapat Anda bayangkan dengan melihat kode. Menggunakan C, karena C paling cepat, dan masalah ini membutuhkan solusi cepat. Saya sudah menguji ini untuk nomor favorit saya, seperti 7, 13, dan 42, dan sepertinya berhasil.

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];
}
Konrad Borowski
sumber
3
Saya pikir maksud Anda results[number];?
ace_HongKongIndependence
31
@ace: Keduanya bekerja, saya hanya lebih suka membuat lebih banyak kebingungan di sini. Silakan lihat stackoverflow.com/q/381542/736054 untuk informasi mengapa sintaks ini valid dalam C.
Konrad Borowski
8
@ ArchlaudPierre Itulah keindahan solusi trolling kode seperti ini. Mereka OK untuk rentang tertentu, yang mungkin membodohi Anda dengan berpikir mereka sebenarnya dapat digunakan!
Tn. Lister
2
@MrLister Mereka yang benar-benar dapat digunakan. Pertanyaannya tidak mengatakan kisaran nilai apa yang diterima. Mungkin ada konteks di mana ini benar-benar nilai yang dapat diterima.
Pierre Arlaud
9
@ArlaudPierre: Ya, ada troll lain yang tersembunyi dalam kode saya. Beberapa nilai tidak valid, tetapi bukan berarti siapa pun akan memerhatikan hal itu (terutama karena mereka tetap teratur). Dan kemudian orang akan mengeluh tentang bug Pentium FDIV lain.
Konrad Borowski
30

C

Trik dan sihir akan membuatnya bekerja.

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

Ini akar kuadrat terbalik cepat .

Camilan
sumber
7
Saya tahu seseorang akan melakukan ini :) Ini seperti apa sihir sungguhan
qwr
8
Saya menghabiskan hampir satu menit mencari 1 / y untuk mengubahnya dari root terbalik menjadi root sebenarnya. Alternatif menggunakan return x * y adalah benar, tetapi lebih sulit dikenali.
Level River St
1
Saya akan berpikir 10 iterasi terlalu banyak. 2-3 biasanya cukup.
njzk2
1
@ njzk2 sebenarnya di mesin Quake 3 hanya satu iterasi yang digunakan. Yang kedua dikomentari dengan catatan tambahan "ini bisa dihapus". codemaestro.com/reviews/9
Entahlah
29

Python 3

Kalian salah melakukan semuanya. Siapa pun dapat melihat bahwa akar kuadrat dari 20 bukan 4.47213595499958, atau bahkan √20. Solusi ini memindahkan tugas sulit menghitung akar kuadrat ke modul yang dimaksudkan untuk tujuan ini.

Salah satu modul tersebut adalah sympy, yang menyediakan matematika akar kuadrat. Tidak seperti solusi lain di sini, itu benar-benar melakukan segalanya dengan benar. Bahkan mengasumsikan bahwa sqrt (-1) adalah I - tidak ada solusi di sini yang bisa menyelesaikannya.

Dan di sini adalah kode modular, seperti itulah tampilan program yang bagus. Fungsi harus sekecil mungkin, jika tidak, itu berarti Anda menulis program yang buruk. Selain itu, program harus memiliki banyak komentar.

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

Dan berikut ini contoh program yang berfungsi.

> python sqrt.py 
Specify number: 10 + 10
2*sqrt(5)
> python sqrt.py 
Specify number: cos(pi)
I
Konrad Borowski
sumber
12
-1 tidak cukup komentar
alexwlchan
5
@alexwlchan: Menambahkan lebih banyak komentar.
Konrad Borowski
2
Itu adalah nama fungsi yang sangat pendek, mudah dimengerti, deskriptif! +1! PS Menambahkan lebih banyak komentar.
AMK
2
-1 nama fungsi tidak cukup panjang, seharusnya 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.
The Guy with The Hat
1
@TheGuywithTheHat: Saya lebih suka jika nama fungsi saya yang besar akan cocok dalam kotak kode tanpa bergulir horizontal. Bahkan jika itu kode-troll , saya benci bergulir.
Konrad Borowski
28

JavaScript

Sayangnya, JavaScript tidak mendukung simbol akar kuadrat untuk nama fungsi. Sebagai gantinya, kita dapat menggunakan beberapa karakter alfabet Unicode lainnya untuk mewakili fungsi akar kuadrat.

Dalam contoh ini saya akan gunakan .

Setelah kita memiliki simbol yang valid untuk digunakan, kita dapat menggunakan objek Math untuk menghasilkan fungsi root kuadrat.

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

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

Itu mudah! :)

Tentu saja, akan lebih mudah untuk digunakan var ᕂ = Math.sqrt;

nderscore
sumber
16
Saya suka bagaimana kode Anda memecah kompresor JS.
Konrad Borowski
2
@xfix Ya, jika ada yang mencoba mengubah nama fungsi self-executing itu, kode akan rusak :)
nderscore
25

Julia

Jelas cara terbaik untuk melakukannya, dengan menggunakan root Series kuadrat Taylor:

masukkan deskripsi gambar di sini

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

Itu sebenarnya menghasilkan nilai yang sangat tepat:

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

Tapi tentu saja ini seperti sebuah aproximation (dan juga menjadi seri konvergen) tidak berguna untuk nilai-nilai yang tidak mendekati 1:

julia> sqroot(0)  #what?
9.659961241569848

julia> sqroot(4)  #interesting...
-8.234843085717233e7   
PKC
sumber
2
Jari-jari konvergen seri daya ini adalah 1, jadi ini hanya akan bekerja untuk t in (0,2) (atau untuk t kompleks di disk terbuka yang berpusat pada 1 dari radius 1). Untuk nilai lain, Anda dapat menggunakan faktorisasi ...
gniourf_gniourf
Anda benar, saya tidak menentukan interval konvergensi hanya untuk kesederhanaan :)
CCP
2
Terlalu berguna untuk seleraku. Anda dapat dengan mudah membagi dengan 4 sampai dalam batas, lalu gandakan hasilnya dengan kekuatan yang sesuai dari 2.
user19713
1
^ Saya pikir aman untuk mengatakan bahwa penanya yang malas biasanya hanya akan menerima apa adanya.
Joe Z.
Saya pikir Anda kehilangan fakta bahwa Seri Taylor dipindahkan dan 1 berpusat, jadi jika saya membaginya dengan a^2(n kali) dan kalikan dengan a(n kali) jawabannya ( sqrt(x)~a^n*sqroot(x/a^2n)) x-> 0 (jika a> 0) tidak ke 1 (memberi kesalahan besar). Juga jika x / a ^ 2n ~ 1 angka a!=xdan nakan berubah untuk sewenang-wenang xuntuk mendapatkan presisi yang diinginkan (membuat menjengkelkan dan memakan waktu untuk menemukannya).
PKC
20

Getah

Solusi untuk ini cukup sulit dan sangat kompleks, jadi ambil kopi Anda. Masalahnya adalah, itu tergantung pada nomor apa yang Anda inginkan kuadrat dari kode berubah secara signifikan. Saya akan tunjukkan masalahnya. Katakanlah itu 9nomor Anda. Maka kode akan terlihat seperti ini:

\sqrt{9}

Sekarang katakanlah itu 1234321nomor Anda, lihat kode:

\sqrt{1234321}

Terakhir namun tak kalah penting katakanlah nomor Anda 0.

\sqrt{0}

Cara yang baik untuk menyelesaikan ini adalah dengan menulis sebuah program di Ook!atau Piet, yang ingin nomor Anda dan hasilkan LaTeX-sqrt-codeuntuk itu. Berikut ini adalah contoh yang sangat sederhana Ook!, karena hanya dapat membaca satu byte dan tidak memeriksa apakah byte ini adalah nomor yang sah atau tidak, tapi saya pikir Anda akan langsung ke intinya.

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

Sama untuk Piet:

Apakah sama dengan program sederhana yang ditulis dalam Ook!

Ini akan menjadi cara yang paling efisien. Saya juga menyarankan untuk menggunakan Pietkarena setiap kali karya seni yang indah, sehingga hal-hal tidak cepat membosankan.

NaCl
sumber
3
Saya ingin kode Piet ini, tapi itu hanya kompiler Brainfuck (yang bisa saya temukan di Internet) yang mengeksekusi kode Ook.
Konrad Borowski
11
Tunggu sebentar? Ini adalah program esolang yang menjalankan kompiler bahasa lain untuk menguraikan bahasa ketiga? Oh Boy!
Kroltan
Ook hanyalah lambang untuk kata di Brainfuck.
Ross Presser
20

Haskell

Saya berhenti memercayai komputer ketika saya pertama kali mendengar tentang kesalahan floating-point. Maksudku, serius, jika bahkan Google tidak bisa mengendalikan mereka , lalu siapa yang bisa?

Jadi taruhan terbaik kami adalah menemukan solusi yang hanya melibatkan bilangan bulat. Untungnya itu mudah karena kita bisa memeriksa semua angka, karena setiap interval [1..n] hanya berisi jumlah yang terbatas, tidak seperti real alfa-1 omong kosong. Berikut ini contoh implementasi di Haskell:

import Prelude hiding (sqrt)
import Data.List

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

Bekerja seperti jimat, lihat:

λ> sqrt 8
2

Akurasi harus cukup untuk sebagian besar aplikasi.

Flonk
sumber
2
+1.0 untuk "omong kosong aleph-1 real"
wchargin
2
@ M.Mimpen Ackhhhchh: duckduckgo.com/…
AMK
1
@ AMK Huh. Mungkin Google menggunakan doubles dan DDG menggunakan triples.
wchargin
16

Jawa

Cara paling tepat untuk melakukan ini adalah untuk beralih. Pertama, loop by integers sampai Anda melewati target, lalu beralih ke doubles. Metode ini memiliki keuntungan tepat , tidak seperti metode "estimasi" lain yang mungkin Anda lihat. Anda mengorbankan sedikit kecepatan, tetapi untuk sebagian besar aplikasi, inilah yang Anda butuhkan.

Anda dapat mengubah jawaban ini tergantung pada seberapa tepat Anda perlu, tetapi ini harus bekerja setidaknya untuk satu miliar:

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

Ini membutuhkan waktu sekitar 3 detik sqrt(99.9999998);untuk saya. Berkeliaran melalui (hingga) satu miliar ganda membutuhkan waktu saya kira.

Geobit
sumber
1
Masalah dengan menggunakan 0.000000001adalah bahwa itu rawan kesalahan pembulatan. Saya telah membuat solusi yang lebih tepat di C ++.
Joe Z.
2
@ Joz. Ya, yang mendapatkan +1 saya, tetapi yang ini cukup bagus untuk pekerjaan pemerintah. Tentu saja, Anda mengembalikan NaN untuk jawaban apa pun yang tampaknya tidak dapat diwakili oleh dua kali lipat, sehingga tepat sedikit lebih tinggi di udara;)
Geobits
Benar. Haruskah saya menempatkan deteksi epsilon di sana?
Joe Z.
3
Mengapa tidak melakukan Math.nextUp(root)bukan +0.000000001? Itu akan memakan waktu lebih lama ... dan dijamin akan berhasil.
Justin
1
@ Quincunx Saya pikir ada metode yang melakukan itu Doubledan terkejut ketika saya tidak bisa menemukannya. Tidak berpikir untuk melihat ke dalam Math, tetapi ini bekerja dengan cukup baik. Saya belum "gagal" pada apa pun.
Geobits
11

Javascript

Konstanta ajaib ini dapat digunakan untuk menghitung akar kuadrat dari angka menggunakan alfabet:

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

Tes:

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

Tampaknya bekerja dengan cukup baik. Saya ingin tahu apakah ada cara yang lebih pendek?

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

Paul
sumber
10

JavaScript

Masalah yang sangat sulit!
Tidak ada fungsi bawaan untuk itu dalam JavaScript ...
Sepertinya pekerjaan untuk pemecah 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;
}

Sekarang kamu bisa menggunakannya Math.sqrt

Michael M.
sumber
Bagaimana cara troll ini? Apakah ini fakta yang memberikan jawaban negatif?
Joe Z.
1
@ Joz. Menggunakan pemecah Newton-Raphson untuk pekerjaan rumah untuk pemula adalah troll. Ini bukan jawaban yang diharapkan tetapi berhasil, dan dia akan menghabiskan waktu mencoba memahami kode.
Michael M.
28
-1 tidak cukup jQuery.
Pierre Arlaud
5
@ArlaudPierre Semoga Anda tidak benar-benar memberikan -1 ...
tomsmeding
@tommeding Dia tidak.
Justin
10

JavaScript / ActionScript

Tidak ada cara untuk secara langsung menghitung akar kuadrat dalam ActionScript atau JavaScript, namun, ada solusinya. Anda bisa mendapatkan akar kuadrat dari angka dengan menaikkannya ke 1/2daya.

Ini adalah tampilannya di JavaScript dan ActionScript 2:

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

Dan meskipun fungsinya bekerja dengan baik di ActionScript 3, saya akan merekomendasikan menggunakan variabel yang diketik dan mengembalikan nilai untuk kejelasan dan keandalan:

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

Troll itu:

Meskipun apa yang saya katakan tentang num^(1/2)menghasilkan akar kuadrat adalah benar dalam matematika, apa yang sebenarnya dilakukan ^operator dalam JavaScript dan ActionScript adalah Bitwise XOR .

IQAndreas
sumber
1
Jawaban terbaik di luar sana. Saya menyukai operator 'power'
Silviu Burcea
Jawaban seperti itu akan lebih jahat di C atau Python2, di mana juga 1/2 == 0.
aland
9

Python 2.7

n = input("Enter a number which you want to make a square root: ")
print "\u221A{} = {}".format(n**2, n)

Penjelasan

Mengutip

Wikipedia - Root kuadrat

Dalam matematika, akar kuadrat dari angka a adalah angka y sedemikian rupa sehingga y 2 = a

Dengan kata lain setiap angka adalah akar kuadrat dari beberapa angka lainnya.

Catatan

Pertanyaan ini bagi saya terlihat mirip dengan teka-teki terkenal Bagaimana membuat garis lebih pendek tanpa menggosok atau memotongnya

Abhijit
sumber
9

PHP (dan lainnya):

Karena cara yang dijelaskan pertanyaan itu tidak berarti bahwa kita benar-benar perlu menghitungnya, inilah solusi saya:

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

Ini menyediakan cara untuk menghitung secara akurat akar kuadrat dalam berbagai bahasa.

Daftar bahasa dapat diperluas.

Nilai dapat dikirim melalui POST, DAPATKAN, cookie atau bahkan disimpan dalam sesi.

Jika Anda hanya memberikan nomornya, ia menjadi bingung dan memberikan hasil yang dihitung, yang berlaku untuk (hampir) SETIAP bahasa!

Ismael Miguel
sumber
8

C

Ini lebih baik daripada semua 27 jawaban lain karena semuanya tidak akurat. Itu benar, mereka hanya memberikan satu jawaban ketika seharusnya ada 2. Yang ini bahkan tidak mencoba menjawab jika itu akan salah, itu hanya menyerah dan berputar-putar.

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

Kode-trolling:

  • Penamaan yang sangat aneh
  • forpenyalahgunaan lingkaran
  • Menempatkan titik koma di awal baris, di mana seharusnya
  • #definegunakan untuk meningkatkan penurunan keterbacaan
  • pesan penggunaan tidak berguna
  • minus atau plus bukannya plus atau minus
  • mengembalikan sebuah string
  • mengembalikan variabel lokal
  • 4 peringatan kompiler (2 hasil ekspresi yang tidak digunakan, mengembalikan alamat variabel lokal, bukan string literal di printf)
  • hanya berfungsi untuk kuadrat sempurna non-negatif <100 (alias 0, 4, 9, 16, 25, 36, 49, 64, dan 81) karena jawabannya hanya boleh 1 digit (menyentuh spasi belakang setelah jawabannya dicetak tanpa alasan apa pun) , jadi misalnya √1024mengembalikan 3√1024 = ∓32, yang hanya salah)
0942v8653
sumber
#define the number... bagus! Saya menyukai alasan Anda tentang kondisi untuk menunjukkan pesan penggunaan, khususnya.
CompuChip
-1 karena pesan penggunaan akan ditampilkan jika saya memasukkan lebih dari 2 miliar parameter baris perintah. Atau mungkin hanya 32.768 dari mereka jika saya menjalankannya pada mesin 16-bit seperti PDP-11. (Di sana, itu tanggal saya). Tidak ada yang benar-benar mungkin karena dalam kedua kasus arsitektur akan melarang memasukkan banyak parameter kecuali saya memalsukan panggilan ke utama dan hanya berbohong kepada Anda. Yang bukan tidak mungkin: saya mungkin melakukan itu. Memang, aku mungkin sudah berbohong padamu.
ClickRick
8

C ++

berdasarkan http://en.wikipedia.org/wiki/Fast_inverse_square_root dan jawaban @ snack.

Kecuali alih-alih lari pada cara untuk mengubah x ^ (- 0,5) menjadi x ^ (0,5) saya memodifikasi algoritma untuk melakukannya secara langsung.

ALGORITMA

Berikan angka floating point (dalam hal ini double) ke integer (dalam hal ini panjang).

Beberapa bit pertama dari angka floating point adalah eksponen: yaitu, nomor tersebut disimpan sebagai 2 ^ AAA * 1.BBBBBBBB. Jadi lakukan pergeseran hak dan eksponen ini dibelah dua.

Dalam akar kuadrat terbalik asli , angka ini dikurangkan dari konstanta untuk memberikan kebalikan. Saya hanya menambahkannya ke konstanta, karena saya ingin akar kuadrat secara langsung. Nilai konstanta dipilih untuk memberikan jawaban yang merupakan perkiraan terbaik untuk nilai yang diinginkan.

Masukkan nomor kembali ke titik apung.

Secara opsional, satu atau dua iterasi metode Newton dapat digunakan untuk meningkatkan hasilnya, tetapi saya tidak repot, karena saya ingin melihat seberapa dekat saya bisa mendapatkan tanpa.

Konstanta yang digunakan terlihat sangat misterius, tetapi di luar beberapa digit pertama, nilainya tidak kritis. Saya menemukan konstanta dengan coba-coba. Saya berhenti begitu mendapat nilai yang terkadang diremehkan dan terkadang terlalu tinggi.

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

Hasil

Pengecoran hanya diperlukan karena C tidak akan memungkinkan Anda untuk melakukan operasi bitshift pada float, jadi satu-satunya operasi nyata adalah bitshift dan penambahan. Saya belum pernah menggunakan iterasi tunggal dari metode Newton untuk meningkatkan hasilnya, jadi ketepatannya luar biasa. Guru OP akan terkesan dengan kecepatan metode yang (sejujurnya) cukup akurat untuk banyak tujuan!

masukkan deskripsi gambar di sini

Level River St
sumber
Titik apung yang super akurat
Cole Johnson
2
@ ColeJohnson Yah Anda tidak dapat memiliki output yang tepat, itu adalah kendala dunia komputer (kita tidak dapat memiliki memori tak terbatas). Jadi saya akan mengatakan ini seakurat yang didapatnya.
Pierre Arlaud
Baik ganda jelas berlebihan, dan bagian dari troll. Saya berharap mendapatkan sekitar +/- 30% dari metode ini. Trolling terpisah, saya kagum betapa akuratnya itu. Sebagian alasannya adalah ini: 4 = 2 ^ 10* 1. 000, sqrt (4) = 2 ^ 01* 1. 000= 2, sqrt (2) = 2 ^ 00* 1. 100= 1,5. Jadi 1bit yang bergeser dari eksponen memberikan mantissa 1,5, yang tidak jauh dari nilai sebenarnya dari sqrt (2) yaitu sekitar 1,4. Tetapi tidak tahu bagaimana itu secara konsisten memberikan jawaban dengan akurasi lebih baik dari 3%.
Level River St
7

E

Catatan: ini hanya berfungsi di komputer saya, karena perangkat keras yang mendasarinya tidak menyimpan angka dalam biner tetapi dalam basis e, sedemikian rupa sehingga apa yang tampak 10mewakili e, 100mewakili e e , dan sebagainya. Dengan cara ini, apa yang Anda mungkin pada mesin biner panggilan sedikit-bergeser ke kiri melakukan x => e x , dan apa yang Anda mungkin pada mesin biner panggilan sedikit-bergeser ke kanan melakukan x => ln x. Jelas, sulit untuk mewakili angka yang mendasarinya pada media internet biner-sentris yang sangat terbatas ini, tetapi saya melakukan yang terbaik.

Sintaks E sangat mirip dengan C / C ++, jadi ini seharusnya mudah bagi kebanyakan orang untuk mengerti.

double sqrt(double n)
{
    return ((n >> 1) / 2) << 1;
}
KlikRick
sumber
7
Apakah ini bahasa asli?
Joe Z.
Komputer jenis apa yang Anda gunakan?
Cole Johnson
@ClickRick Kapan saja Anda bisa memberikan tautan untuk sintaks pemrograman E dan skema perintah?
WallyWest
6
Maaf, tetapi bahkan dalam basis e, n >> 1tidak sama dengan log(n).
jwg
2
Bahasanya cukup mudah untuk disimpulkan. Keberadaan perangkat keras pendukung adalah bagian yang harus Anda pertanyakan.
ClickRick
6

JavaScript / HTML / CSS

Saya berpikir tentang menggunakan jQuery dan id untuk sedikit lebih troll, tapi saya lebih suka vanilla js.

Hasilnya tidak sepenuhnya tepat, tetapi berhasil!

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;
}
sebcap26
sumber
6

GeoGebra

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

Baca nilai jawaban Anda dari sumbu koordinat.


Cobalah online di sini (memerlukan Java), atau nikmati beberapa tangkapan layar di bawah ini:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

ace_HongKongIndependence
sumber
6

100% murni (berbasis integer)

Dengan presentasi ascii-art:

Kotak akar yang sempurna ini harus bersumber di bash dengan menggunakan sourceperintah

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

Lama (versi ini dapat dengan mudah disisipkan ke terminal konsol mana saja)

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

Akan bekerja seperti:

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

Harap dicatat: Rootnya adalah persegi !!

F. Hauri
sumber
4

Jawa

Terima kasih, untuk ggmx tentang kode untuk menghasilkan n digit pi di java .

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

Tidak merasa ingin menerapkan input. Untuk menguji perubahan kode sqrtThisdan expectedPercision.

Berikut adalah cara kerjanya. Pertama, mendapatkan root sqrt untuk integer adalah sepele jadi saya tidak merasa ingin mengimplementasikannya dan sebagai gantinya digunakan javas yang dibangun dalam sqrt fcn. Sisa kode 100% sah.

Ide dasar, karena pi adalah bilangan desimal panjang non-berulang tak terhingga semua urutan angka harus terjadi di dalamnya (baca edit). Karenanya jawaban Anda ada di dalam pi !! Karena itu kami hanya dapat menerapkan pencarian regex pada pi mencari jawaban Anda. Jika kami tidak dapat menemukan jawaban yang baik maka kami hanya akan menggandakan ukuran pi yang kami cari!

Ini sangat mudah, bahkan orang dapat mengatakan bahwa itu semudah pi :)

Sunting
Pi belum terbukti mengandung setiap urutan angka hingga di dalamnya. Fakta bahwa pi tidak terbatas dan tidak berulang bukanlah bukti yang cukup untuk pernyataan seperti yang dibuktikan oleh Exelian. Namun banyak ahli matematika percaya pi berisi setiap urutan bilangan terbatas.

Sahar Rabinoviz
sumber
Saya ingin mencatat bahwa menjadi tak terbatas dan tidak berulang tidak membuat setiap urutan muncul dalam angka. Sangat mudah untuk membuat angka yang tidak terbatas dan tidak berulang tetapi tidak memiliki setiap urutan yang mungkin di dalamnya, misalnya 0.1011001110001111 ... Saya tahu ini adalah nitpicky, tetapi orang sering menggunakan argumen ini secara salah (pi mungkin memang berisi setiap kemungkinan berurutan, kita tidak tahu pasti)
Exelian
@Exelian melakukan perbaikan sesuai dengan komentar Anda, memberikan tautan untuk mencadangkan baik komentar Anda dan alasan mengapa solusi saya masih mencukupi.
Sahar Rabinoviz
3

JQuery

ini adalah yang paling akurat (bonus: juga berfungsi untuk surat!)

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

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

Ini biola

Mhmd
sumber
3
Mengambil tantangan terlalu harfiah tidak terlalu lucu. Meskipun saya tidak berpikir document.writecounter cukup.
John Dvorak
2
@ JanDvorak ini adalah kode-trolling, solusi seperti itu berlaku di sini.
Mhmd
3
@Mhmd: Namun, kami berharap Anda menjadi kreatif di sini. Semua orang sudah melakukan itu, lakukan sesuatu yang lain. Anda tidak akan mendapatkan banyak upvotes dengan cara ini.
Konrad Borowski
1
@ JanDvorak / xfix: Jika masalahnya adalah kualitas jawabannya rendah sementara masih memenuhi kriteria minimum, bukankah solusi untuk membiarkan jawabannya tenggelam ke bawah dengan skor? (Karena itu sudah merupakan kesimpulan yang hilang, menurut tautan Anda.)
Andrew Coonce
1
@ JanDvorak: Poin bagus. Menimbang itu, terima kasih atas penjelasannya!
Andrew Coonce
3

C ++

Ini pada akhirnya akan memberi Anda akar kuadrat.

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

Saya memperbaiki kode untuk mencerminkan pertanyaan dengan lebih baik. Terima kasih atas saran Anda ... kode diperbarui.

bacchusbeale
sumber
Karena Anda sudah dibatasi oleh mesin epsilon, mengapa tidak menggunakannya x+=1e-16?
Kyle Kanos
1
@KyleKanos Atau lebih tepatnya DBL_EPSILON,.
Cole Johnson
3

Python

Solusi ini:

  1. tidak deterministik dan menghasilkan jawaban perkiraan
  2. adalah O (N) dan cukup lambat, bahkan untuk N rendah
  3. bergantung pada hubungan matematika yang tidak jelas

Spoiler:

Jumlah N variabel bebas seragam [-5, .5]. Perkirakan deviasi standar dengan mengambil nilai rata-rata absolut. Seperti yang terjadi, standar deviasi sebanding dengan sqrt (N) sebagai N -> infty. 139 dan 2.71828 hanyalah faktor skala yang mengontrol presisi dan mereka dipilih untuk terlihat misterius.

Kode:

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)))
Emanuel Landeholm
sumber
3

C ++

Pertanyaan Anda tidak dikompilasi karena Anda meletakkan! pada akhirnya. C ++ tidak suka!
Di sini pertanyaan yang tepat untuk kompiler:

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

Oh .. dan file 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

dan 26317.def. Ini seharusnya sudah ada di kompiler Anda

#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 

Yap, seseorang dapat menggunakan -E untuk menampilkan jawaban preprocess yang benar, tetapi jika Anda tahu -E Anda juga tahu bagaimana cara squareroot. : P Di sini beberapa preprocessed. Solusi minimal yang sangat buruk, tidak ada cek terikat, tidak ada prompt. TIL trigraph itu diproses sebelumnya.

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