助けて!!平方根の実行方法![閉まっている]


42

こんにちは皆さん、私のクラスでは数値の平方根を作成する必要がありますが、うまくいきません!!

挑戦:

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

注:これはコードトローリングです。プログラミングの成功への道をこの新しいプログラマーに導くために、「有用な」答えを与えてください!クリエイティブに!


63
@CloseVoters勝利基準がないため、[コードトローリング]をトピック外として閉じるための投票を停止してください。この場合、これは明らかに[人気コンテスト]です。必要に応じて編集します。[コードトローリング]が好きではないからといって、他のすべての人の課題を解決しなければならないわけではありません。明らかに、多くの回答者がこの種の課題を好んでおり、回答の数からもわかるように、SEはコミュニティ主導型のサイトであるため、これらの人々のために公開したままにしておきます。
ジャスティン14

12
@Quincunx記録については、私の投票はToo Broadに対するものでした。文字通り、「平方根に関連するものを作成する」以外には何もありません。(すでに15の回答があることから明らかです。)
ドアノブ

7
投票者:これが他の非公開の [コードトローリング]質問よりも「広範」である方法を理解するのに役立ちますか?ここには正当な正当な理由があるかもしれませんが、コードトローリングのカテゴリは当然、ほとんどの課題よりも少し広くなるでしょう。そうしないと、目的が多少損なわれます。
ジオビット14

6
@Geobitsは、答えが正確である必要さえないと言って、これは「コードを書く」と同じくらい広いです。
ピーターテイラー14

11
@Gareth興味深いアナロジーですが、元のコメントとは一致しません。マクドナルドの外に一日中立ち寄って、食べ物がくだらないことを知らせるバナーを掲げることができます。そして、あなたはこの質問に対する否定的なコメントを下票/プットすることを歓迎します。ただし、人々がマクドナルドに入場するのを物理的に停止しようとすると(2回目の投票の開始に相当します)、逮捕される可能性が高くなります。私はアンチコードトローリングの原因に同情していますが、この質問には賛成(または反対)しません。ただし、回答があれば自由に投稿できます。
レベルリバーセント14

回答:


121

Java

うわー、これは複雑な問題です。私は前に平方根をやったことがありません。平方根を取得しましたが、まだ実行していません。コードをクラスの見栄えを良くすることを忘れないでください。入力した数値の平方根を作成するコードは次のとおりです。

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

public class SquareRoot {

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

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

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

トロール:

  • 明らかに、コードは難読化されています。
    • コードでアートのボーナスポイントを獲得できますか?
  • System.out.printsがに印刷されませんjava.lang.System.out.print。それらは内部クラスに出力します。最初の2つ(文字列を出力することになっています)は何もしません。2番目:
  • ウィンドウに出力します。サンプル出力-平方根が表示されますか(入力は100)?:ここに画像の説明を入力してください
  • ウィンドウは閉じても何もしません。ALT-F4、閉じるボタンのクリック、またはそれ以外は通常閉じることはできません。
  • ウィンドウは常に他のウィンドウの上にあります。最大化されているという事実と組み合わせて、これを閉じるには少し考えが必要です。
  • 正しい数値に達するまで、数値から整数の加算によってsqrtを見つけます。整数のラップアラウンドを待つため、これには長い時間がかかります。このため、実際には、数字が大きいほど時間がかかりません。サンプル出力の場合、20秒かかりました。
  • 入力がの場合、正しく機能しません0。同じ理由で入力が負の場合は無限ループで失敗し、入力がの場合は無限ループで失敗します0
  • 私は自分でトロールし、これをコーディングして調整するのに約2時間費やしました。

11
優れたトロール、良い先生。
コードウィスパラー14

1
JFrame.DO_NOTHING_ON_CLOSEトロルのリストから除外したと思います...
PlasmaPower 14

2
@PlasmaPower私はそれを編集しようとしていました。あなたsetAlwaysOnTop(true)も言及するのを忘れていました。
ジャスティン14

4
「私は自分自身をトロールしました」私はあなたもあなたのガールフレンドをトロールしたと思います、笑
Herjan 14

15
@ヘルジャンのガールフレンド?何のガールフレンド?
ジャスティン14

71

C ++

良いルートがない場合は、ブルートフォースソリューションが常にあります。

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

これは、正方形のが見つかるまで、実際のdoubleとしてdoubleを使用して実際に反復する良い方法がないため、aのすべての可能な値を反復しますdouble(同じビットサイズのuniona long longでそれを実行します)n


12
今、あなたは私が疑問に思っています、これは実際にどのくらいの頻度で(実行する無制限の時間を与えられます)、そしてどれくらいの頻度で正確な一致を見つけてNaNを返すのに失敗しますか?私はそれが約50/50だと思っていますが、良い数学的な思考のためにはここでは遅すぎます。
ホッブズ14

29
なんてこった、a doubleとaの結合long longは今まで見た中で最も恐ろしいものだ。
パトリックコリンズ14

10
たぶんこれが望まれます(トローリングの一部)が、aの異なる部分へのアクセスunionは未定義の動作であり、関数を使用してdoubleを反復処理することは可能ですstd::nextafter
誰も14

6
std::nextafterあなたが私にそれを言及する前に私は存在していなかったので、ええ、それは欲しかったです。
ジョーZ. 14

3
いくつかdoubleの値が乗算から製造することができないx*x場所xdoubleも、。そのため、検索は時々成功せず(ほとんどの場合)、より正確な結果ではなくNaNが返されます。
セージボルシュ14

64

Python 3

次の簡単なコードで正確な答えが得られます。

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

入力した数字の前に文字を印刷するだけです。



24
一方、@ JanDvorakは、これが常に正確な答えを出す唯一のプログラムです。
レベルリバーセント14

1
@steveverrill:いいえ、私もそうです。
NaCl 14

1
@steveverrill:このプログラムに挑戦し、常に正しい答えを出し、実際に問題を解決するプログラムを作成しました(ちなみに、Cプログラムではなく、私のPython 3プログラムです)。
コンラッドボロスキー14

16
@JanDvorakこれはコード・トローリングである
TheDoctor

45

Python 3では、次のことができます。

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

38
私はあなたのトロルを見つけました:これは機能しません。どうやらそうですが、2行目はインデントする必要があります。
ジャスティン14

7
@DLehは自分でトローリングしている可能性はありますか?
krs013 14

42

この答えを修正

Cが最も速いため、Cを使用する

それは単純に間違っています。誰もが最速のものがASMであることを知っています。

純粋なx86_64 ASM!

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

他の遅延回答とは異なり、これにはO(1)の複雑さがあります!
そしてまた、他の答えとは違って、これはために、101%正確であるsqrt(0.5)ことができます0.70710678118655

トロール:
*アセンブリでの書き込み。誰もアセンブリに書き込みません
* O(1)であっても高速になりません。任意の番号でsqrtを実行するには、システムで約90秒かかります。
*ハードコードされたジャンプ位置。
*スタックフレームなし
* AT&T構文。一部の人々は既にそれを荒らしと考えています。

説明:あなたはIEEEフロート仕様を見れば、あなたがあれば、あること、ダブルスのバイナリ表現を注文していることに気づくかもしれませんa > b、その後*(long long *)&a > *(long long *)&b
このトリックを使用して、FPUで二乗し、引数とCPU比較を実行するたびに、回答の上位ワードを反復処理します。
次に、下側のdwordについても繰り返します。
これにより、ほぼ一定数の計算で正確な答えが見つかります。


5
修正の修正:コンパイラは人間よりも最適化できるため、Cはアセンブリよりも高速です。すべての単一のx86アセンブリ操作を知っている場合を除き、コンパイラは通常、より良いコードを記述します。
コンラッドボロスキー14

30
@xfix修正の修正:手元にあるインテルのマニュアルを使用すると、人間はGCCよりも効率的なアセンブリを作成できます
mniip 14

6
@xfixあなたのようなすべてのニーモニック、スタッフのために簡単な説明を読んで後PCMPEQQ「コンパイラによって生成される魔法の読めないゴミ」としてあなたに表示されなくなった
mniip

1
あなたが私の研究室のパートナーになればいいのに、アセンブリで何をしているのかわかりません。陽気な回答/コメント。
HC_ 14

@mniip(修正の修正)^ 3:スーパーオプティマイザーは、可能な限りの一連の命令を試行することで最適なコードを見つけ、人間を上回ることができます^ _ ^確かに平方根に組み込まれるべきですか
ナビン14

39

Python

「数値の平方根を作成する」関数またはプログラムを作成します。

クラスで許可されている場合は、ここでヘルパーとして複雑な数学ライブラリを使用できます。次のコマンドを実行してインストールします。

pip install num2words

次に、このpythonスクリプトのようなものを実行します。

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

(必ず管理者権限で実行してください)


これがどのようにトローリングしているか説明できますか?
帽子を持つ男14

6
@TheGuywithTheHat:数値の平方根を与える代わりに、このソリューションは、数値の平方で名付けられたユーザーを作成し、そのユーザーを管理者にします(rootUnixlandの場合)。
ダブロン14

33

C

明らかにこれが最良の方法です。コードを見ると想像できるほど高速です。Cが最も高速であり、この問題には高速な解決策が必要なため、Cを使用します。私はこれを7、13、42などのお気に入りの数字でテストしましたが、うまくいくようです。

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

3
私はあなたが意味すると思うresults[number];
ace_HongKongIndependence 14

31
@ace:両方とも機能します。ここで難読化を行うことをお勧めします。見てくださいstackoverflow.com/q/381542/736054をこの構文はCで有効である理由については、
コンラッド・ボロウスキ

8
@ArlaudPierreこれは、これらのようなコードトローリングソリューションの美しさです。特定の範囲では問題ありませんが、実際に使用できると思わせる可能性があります。
ミスターリスター14

2
@MrLister彼らはある実際に使用可能。質問は、どの範囲の値が受け入れられるかを述べていません。これが絶対に許容可能な値であるコンテキストがあるかもしれません。
ピエールアラード14

9
@ArlaudPierre:さて、私のコードには別の、隠れたトロールがあります。一部の値は無効ですが、誰もがそれに気付くわけではありません(特に、とにかく順序が整っているためです)。そして、人々は別のPentium FDIVバグについて不平を言うでしょう。
コンラッドボロウスキ14

30

C

トリックと魔法が機能します。

#include <stdio.h>

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

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

それはだ平方根逆高速


7
私は、誰かがこれを行うだろう知っていた:)これは好きなものを本当の魔法のルックスで
QWR

8
1 / yを探して、逆ルートから実際のルートに変換するのに1分近く費やしました。return x * yを使用する代替方法は正しいですが、見つけるのはより困難です。
レベルリバーセント

1
10回の繰り返しは多すぎると思います。通常は2〜3で十分です。
njzk2

1
@ njzk2は実際にはQuake 3エンジンで1回の反復のみが使用されました。2番目のものは、「これは削除できます」という追加のメモとともにコメント化されています。codemaestro.com/reviews/9
知らん

29

Python 3

あなたたちはそれをすべて間違っています。20の平方根は4.47213595499958ではなく、√20でもないことが誰でもわかります。このソリューションは、平方根を計算するという難しいタスクを、この目的のためのモジュールに移行します。

そのようなモジュールの1つにsympyがあり、平方根の数学を提供します。ここの他のソリューションとは異なり、実際にはすべてを適切に実行します。sqrt(-1)がIであることさえ想定しています-ここでの解決策はどれもそれを解決できません。

そして、ここにモジュラーコードがあります。これは、優れたプログラムの外観です。関数は可能な限り小さくする必要があります。そうでない場合は、ひどいプログラムを書くことを意味します。また、プログラムには多くのコメントが必要です。

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

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

# We need the system to do the work
import sys

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# Calls main function
main()

# This is end of program

そして、このプログラムが機能する例を次に示します。

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

12
-1十分ではありませんコメント
alexwlchan

5
@alexwlchan:コメントを追加しました。
コンラッドボロスキー14

2
それらは本当に短く、わかりやすく、説明的な関数名です!+1!PSコメントを追加しました。
AMK

2
-1関数名の長さが足りませんprint_format_prompt_with_thing_to_specify_get_default_prompt_format_to_getattr_get_sys_name_from_get_stdout_name_and_print_square_root_of_read_from_stdin_and_print_get_string_from_get_newline_to_getattr_get_sys_name_from_get_stdout_name
帽子の男14

1
@TheGuywithTheHat:私の巨大な関数名が水平スクロールなしでコードボックスに収まるなら、私は好むでしょう。コードトロールの場合でも、スクロールは嫌いです。
コンラッドボロスキー14

28

JavaScript

残念ながら、JavaScriptは関数名の平方根記号をサポートしていません。代わりに、他のUnicodeアルファベット文字を使用して、平方根関数を表すことができます。

この例では、を使用します

有効なシンボルを使用したら、Mathオブジェクトを使用して平方根関数を生成できます。

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

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

それは簡単です!:)

もちろん、使用する方が簡単です var ᕂ = Math.sqrt;


16
あなたのコードがどのようにJSコンプレッサーを壊すかが好きです。
コンラッドボロウスキ14

2
@xfixええ、その自己実行関数の名前を変更しようとすると、コードが壊れます:)
nderscore 14

25

ジュリア

明らかにそれを行う最良の方法は、平方根のテイラー級数を使用することです。

ここに画像の説明を入力してください

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

それは実際に非常に正確な値を出力します:

julia> sqroot(1.05)
1.024695076595856

julia> sqrt(1.05)  #default
1.02469507659596

julia> sqroot(0.9)
0.9486832980855244

julia> sqrt(0.9)  #default
0.9486832980505138

しかし、もちろん、その近似(および収束級数である)のように、1に近くない値には役に立たない。

julia> sqroot(0)  #what?
9.659961241569848

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

2
このべき級数の収束半径は1なので、これは(0,2)のt(または半径1を中心とする開いたディスクの複素t)に対してのみ機能します。他の値について、あなたは...因数分解を使用することができます
gniourf_gniourf

あなたは正しいです、私は単純化のためだけに収束間隔を指定していません:)
CCP 14

2
私の好みにはあまりにも便利です。範囲内になるまで簡単に4で除算し、その結果に対応する2の累乗を掛けます。
user1971314

1
^あなたの平均的な怠け者の質問者は、それを現状のままだと言っても安全だと思います。
ジョーZ. 14

私はあなたがテイラー級数が変位し、1が中央にあるという事実を見逃していると思うので、私がa^2(n回)で割って(n回)a答えsqrt(x)~a^n*sqroot(x/a^2n)を1にしない()x-> 0(a> 0の場合) (大きなエラーを与える)。また、もしX / A ^ 2N〜1の数字a!=xn任意のために変更されますxたかっpresition(迷惑と時間それらを見つけるためにかかる作る)を取得します。
CCP 14

20

ラテックス

これに対する解決策はかなり難しく、非常に複雑なので、コーヒーを飲んでください。問題は、コードの平方根をどのような種類の数値にしたいかによって大きく変化することです。問題をお見せします。それ9があなたの番号だとしましょう。次に、コードは次のようになります。

\sqrt{9}

それ1234321があなたの番号だと言って、コードを見てみましょう:

\sqrt{1234321}

最後になりましたが、番号がであると言いましょう0

\sqrt{0}

これを解決する良い方法は、Ook!またはPietにプログラムを書くLaTeX-sqrt-codeことです。これはあなたの番号を求めて、それを出力します。これはの非常に簡単な例ですOok!。1バイトしか読み取ることができず、このバイトが正当な数字であるかどうかはチェックしませんが、要点はわかると思います。

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

同じPiet

Ookで書かれた単純なプログラムと同じです!

これが最も効率的な方法です。またPiet、毎回美しい芸術品をそのまま使用することをお勧めします。そのため、ものがすぐに退屈することはありません。


3
このPietコードが欲しいのですが、Ookコードを実行するBrainfuckコンパイラ(インターネットで見つけることができます)です。
コンラッドボロスキー14

11
一瞬待って?別の言語のコンパイラを実行して第三言語を解析するエソランプログラムですか?ああ少年!
クロルタン14

Ookは、Brainfuckの単なる単語の光沢です。
ロスプレッサー14

20

ハスケル

浮動小数点エラーについて最初に聞いたとき、コンピューターを信頼しなくなりました。真剣に、グーグルでさえそれらを制御できない場合、誰ができるのでしょうか?

したがって、私たちの最善の策は、整数のみを含む解を見つけることです。幸いなことに、すべての間隔[1..n]に含まれるのは有限な量だけであり、実際のアレフ1の実数ではないため、すべての数をチェックするだけなので簡単です。Haskellのサンプル実装を次に示します。

import Prelude hiding (sqrt)
import Data.List

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

チャームのように機能します。チェックしてください:

λ> sqrt 8
2

ほとんどのアプリケーションでは、精度で十分です。



2
「クラップスアレフ1
リアル

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

1
@AMKフー。たぶん、Googleはdoublesを使用しており、DDGはtriples を使用しています。
wchargin

16

Java

これを行う最も正確な方法は、繰り返すことです。まず、integerターゲットを超えるまでs でループし、次にdoublesに切り替えます。この方法には、他の「推定」方法とは異なり、正確であるという利点があります。少し速度を犠牲にしますが、ほとんどのアプリケーションでは、まさにこれが必要です。

必要な精度に応じてこの回答を変更できますが、これは少なくとも10億までは機能するはずです。

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

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

これには約3秒かかりsqrt(99.9999998);ます。(最大)10億の倍数をループするには、ある程度時間がかかります。


1
使用の問題0.000000001は、丸め誤差が生じやすいことです。C ++でより正確なソリューションを作成しました。
ジョーZ. 14

2
@JoeZ。うん、それは私の+1を獲得しましたが、これは政府の仕事には十分です。もちろん、あなたの答えはNaNを返します。これは、二重では正確に表現できないと思われるため、正確であるため空中で少し上がります;)
Geobits 14

本当です。そこでイプシロン検出を行う必要がありますか?
ジョーZ. 14

3
Math.nextUp(root)代わりにしないのはなぜ+0.000000001ですか?それにはもっと時間がかかります...そしてそれは成功することが保証されています。
ジャスティン14

1
@Quincunx私それを行う方法があると思いDouble見つけられなかったときに驚いた。を見るとは思わなかったMathが、これはかなりうまくいく。私はまだ何も「失敗」していません。
ジオビット14

11

Javascript

これらのマジック定数を使用して、アルファベットを使用して数値の平方根を計算できます。

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

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

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

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

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

テスト:

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

それはかなりうまくいくようです。もっと短い方法があるのか​​な?

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


10

JavaScript

非常に難しい問題!
JavaScriptにはそのための組み込み関数はありません...
Newton-Raphsonソルバーの仕事のように見えます。

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

これで使用できます Math.sqrt


これはどのようにトロールしますか?それは否定的な答えを与えるという事実ですか?
ジョーZ. 14

1
@JoeZ。初心者向けの宿題にNewton-Raphsonソルバーを使用するのは荒らしです。それは予想された答えではありませんが、うまくいきます。彼はコードを理解しようとして少し時間を費やすでしょう。
マイケルM.

28
-1不十分なjQuery。
ピエールアラード14

5
@ArlaudPierre希望は、あなたが実際には得られなかった-1 ...
tomsmeding


10

JavaScript / ActionScript

ActionScriptまたはJavaScriptで平方根を直接計算する方法はありませんが、回避策があります。数値を1/2累乗すると、数値の平方根を取得できます。

これは、JavaScriptとActionScript 2でどのように見えるかです。

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

この関数はActionScript 3でも同様に機能しますが、明確さと信頼性のために型付き変数と戻り値を使用することをお勧めします。

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

トロール:

num^(1/2)平方根の結果について私が言ったことは数学では正しいですが、^演算子 JavaScriptおよびActionScriptで実際に行うことはBitwise XORです。


1
そこに最高の答え。私は「パワー」演算子言っています
Silviu Burcea

そのような答えは、さらにCまたはPython2で意地悪なものになるでしょう1/2 == 0
オーランド14


9

PHP(およびその他):

質問を説明した方法は、実際に計算する必要があることを意味していなかったので、ここに私の解決策があります:

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

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

複数の言語で平方根を正確に計算する方法を提供します。

言語のリストを展開できます。

値は、POST、GET、Cookieを介して送信することも、セッションに保存することもできます。

あなただけの数を提供する場合、それは混乱と(ほとんど)に対して有効である計算結果、得られますEVERYこれまでの言語を!


8

C

これらはすべて不正確であるため、他の27のすべての回答よりも優れています。そうです、彼らは2つあるべきときに1つの答えを与えるだけです。これはそれが間違っている場合でも答えようとはせず、ただあきらめて切り捨てます。

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

#define usage "message"
#define the number

char *squareroot(int number);

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

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

コードトローリング:

  • 非常に奇妙な命名
  • forループ乱用
  • 行の先頭にセミコロンを配置します。セミコロンは、
  • #define可読性を低下させるために使用します
  • 無駄な使用法メッセージ
  • プラスまたはマイナスの代わりにマイナスまたはプラス
  • 文字列を返します
  • ローカル変数を返します
  • 4つのコンパイラ警告(printfの文字列リテラルではなく、ローカル変数アドレスを返す2つの未使用の式の結果)
  • 答えは1桁のみであるため、100未満の非負の完全な正方形(別名0、4、9、16、25、36、49、64、および81)でのみ機能します、たとえば√1024return 3√1024 = ∓32、これは単純に間違っています)

#define the number...いいね!特に、使用法メッセージを表示する条件についてのあなたの推論が好きでした。
CompuChip 14

-1。20億を超えるコマンドラインパラメーターを入力すると、使用方法のメッセージが表示されるためです。または、PDP-11のような16ビットマシンで実行している場合は、おそらく32768だけです。(そこに、それは私とデートします)。どちらの場合も、メインへの呼び出しを偽装して単純にあなたに嘘をついた場合を除き、どちらの場合もアーキテクチャがその多くのパラメーターの入力を禁止するため、どちらも実際には不可能です。それは不可能ではありません:私はそれをするかもしれません。確かに、私はすでにあなたに嘘をついているかもしれません。
ClickRick 14

8

C ++

http://en.wikipedia.org/wiki/Fast_inverse_square_rootおよび@snackの回答に基づきます。

x ^(-0.5)をx ^(0.5)に変換する方法にボルトで固定する代わりに、アルゴリズムを直接修正しました。

アルゴリズム

浮動小数点数(この場合はdouble)を整数(この場合はlong long)にキャストします。

浮動小数点数の最初の数ビットは指数です。つまり、数値は2 ^ AAA * 1.BBBBBBBとして格納されます。したがって、右シフトを実行すると、この指数は半分になります。

元の平方根では、この数値を定数から減算して、逆数を求めました。平方根が直接必要なので、定数に追加します。定数の値は、目的の値に最適な近似である答えを与えるために選択されます。

数値を浮動小数点にキャストします。

オプションで、結果を改善するためにニュートンの方法の1つまたは2つの反復を使用できますが、気にすることはありませんでした。

使用される定数は非常に不思議に見えますが、最初の数桁を超えて、値は重要ではありません。試行錯誤して定数を見つけました。時々過小評価されたり、時には過大評価されたりする値を取得するとすぐに停止しました。

#include "stdafx.h"

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

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

結果

Cではフロートでビットシフト演算を実行できないため、キャストが必要なだけです。そのため、実際の演算はビットシフトと加算のみです。結果を改善するためにニュートンの方法の単一の反復を使用したことがないので、精度は顕著です。OPの教師は、(率直に言って)多くの目的に対して十分に正確なメソッドの速度に感銘を受けます!

ここに画像の説明を入力してください


超正確な浮動小数点
コールジョンソン14

2
@ColeJohnsonさて、正確な出力を取得することはできません。これはコンピューターの世界の制約です(無限のメモリを持つことはできません)。だから、これは得られるほど正確だと思います。
ピエールアラード14

まあ、ダブルは明らかに過剰であり、トロールの一部です。この方法で約+/- 30%が得られると期待していました。ばらばらになっても、その正確さが驚く。理由の一部はこれです:4 = 2 ^ 10* 1。000、sqrt(4)= 2 ^ 01* 1。000= 2、sqrt(2)= 2 ^ 00* 1。100= 1.5。したがって、1指数からシフトアウトされたビットは、1.5の仮数を与えます。これは、約1.4であるsqrt(2)の真の値からそれほど遠くありません。しかし、3%を超える精度でどのように一貫して回答を提供するかはわかりません。
レベルリバーセント14

7

E

注:これは私のコンピューター上でのみ機能します。基盤となるハードウェアは、バイナリではなくベースeに数値を格納するため、10eを100表す、e eを表すなどのようになります。このようにして、バイナリマシンで左にビットシフトを呼び出すとx => e xが実行され、バイナリマシンで右にビットシフトを呼び出すとx => ln xが実行されます。明らかに、この非常に限られたバイナリ中心のインターネット媒体でその基礎となる数字を表現することは困難ですが、私は最善を尽くします。

Eの構文はC / C ++の構文と非常に似ているため、ほとんどの人が理解しやすいはずです。

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

7
これは本当の言語ですか?
ジョーZ.

どのようなコンピューターを使用していますか?
コールジョンソン14

@ClickRick Eプログラミング構文とコマンド体系へのリンクを提供できる可能性はありますか?
WallyWest 14

6
すみませんが、ベースeでも、n >> 1とは異なりlog(n)ます。
jwg 14

2
この言語は簡単に推測できます。サポートするハードウェアの存在は、あなたが疑問に思うべき部分です。
ClickRick 14

6

JavaScript / HTML / CSS

jQueryとidを使用してもう少しトロールすることを考えましたが、バニラjsの方が好きです。

結果は完全に正確ではありませんが、機能します!

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

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

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

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

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

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

    return squareRoot;
}

6

GeoGebra

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

座標軸から回答の値を読み取ります。


ここ でオンライン試す(Javaが必要)か、以下のスクリーンショットをお楽しみください:

ここに画像の説明を入力してください ここに画像の説明を入力してください


6

100%純粋な(整数ベース)

ASCIIアートプレゼンテーションの場合:

この完全な平方根は、sourceコマンドを使用してbashで取得する必要があります

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

古い(このバージョンはコンソール端末に簡単に貼り付けることができます)

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

次のように機能します:

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

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

注意:ルートは正方形です!!


4

Java

javaでn桁のpiを生成するコード提供してくれたggmxに感謝します

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

import static java.lang.Math.sqrt;

public class myClass {

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

    public static BigDecimal pi(int numDigits) {

        int calcDigits = numDigits + 10;

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

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

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

        boolean add = false;

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

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

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

        int sqrtThis = 3;
        int expectedPercision = 4;

        int intgerAnswer = (int) sqrt(sqrtThis);

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

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

        Double bestMatch = -1.0;

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

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

            Double offset = sqrtThis + 1.0;

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

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

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

        System.out.println(bestMatch);
    }
}

入力を実装する気がしませんでした。コード変更sqrtThisとをテストするにはexpectedPercision

コードの仕組みは次のとおりです。まず、整数のsqrtルートを取得するのは簡単なので、それを実装する気はなく、代わりにsqrt fcnに組み込まれたJavaを使用しました。ただし、残りのコードは100%合法です。

基本的な考え方、 piは無限の長い非反復10進数であるため、すべての数値シーケンスはその中で発生する必要があります (編集の読み取り)。したがって、あなたの答えはパイの中にあります!! そのため、piの正規表現検索を適用して、回答を検索できます。適切な答えが見つからない場合は、検索対象のpiのサイズを2倍にします。

それは本当に簡単で、実際にはpiと同じくらい簡単だと言えます:)

Edit
Piは、その中に有限数のすべてのシーケンスが含まれていることが証明されていません。円周率が無限であり、繰り返されないという事実は、Exelianによって証明されたステートメントなどの十分な証拠ではありません。しかし、多くの数学者はpiが有限数のすべてのシーケンスを含むと信じています。


無限で繰り返しないことで、すべてのシーケンスが数字に表示されるわけではないことに注意してください。無限で繰り返しのない数字を作成するのは非常に簡単ですが、可能な順序がすべて含まれているわけではありません。たとえば、0.1011001110001111 ...シーケンスですが、私たちは確実に知りません)
Exelian 14

@Exelianはあなたのコメントに従って修正し、あなたのコメントと私の解決策がまだ十分である理由の両方をバックアップするリンクを提供しました。
サハールラビノビズ14

3

JQuery

これは最も正確です(ボーナス:手紙でも機能します!)

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

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

ここにフィドルがあります



2
@JanDvorakこれはコードトローリングです。このようなソロはここで有効です。
Mhmd 14

3
@Mhmd:それでも、私たちはあなたがここで創造的であることを期待しています。誰もがすでにそれをやっていて、何か他のことをします。このように多くの賛成を得ることはありません。
コンラッドボロスキー14

1
@ JanDvorak / xfix:最低限の基準を満たしながらも回答の質が低いという問題がある場合、解答をスコアで最下位に沈めるだけの解決策ではありませんか?(あなたのリンクによると、それはすでに
忘れ

1
@JanDvorak:良い点。それを考慮して、説明をありがとう!
アンドリュークーンス14

3

C ++

これにより、最終的に平方根が得られます。

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

質問をよりよく反映するようにコードを修正しました。ご提案ありがとうございます...コードが更新されます。


マシンイプシロンに既に制限されているので、使用しないのはなぜx+=1e-16ですか?
カイルカノス14

1
@KyleKanosまたはもっと正確に言うと、DBL_EPSILON
コールジョンソン14

3

Python

このソリューション:

  1. 非決定的であり、おおよその答えが得られます
  2. O(N)であり、Nが低い場合でも非常に遅い
  3. あいまいな数学的関係に依存している

スポイラー:

合計N個の独立したユニフォーム[-.5、.5]ランダム変数。絶対値の平均を取ることにより、標準偏差を推定します。たまたま、標準偏差はN-> \ inftyとしてsqrt(N)に比例します。139および2.71828は、精度を制御する単なるスケールファクターであり、神秘的に見えるように選択されています。

コード:

import math
import random
import sys

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

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

3

C ++

質問をコンパイルしないでください!最後に。C ++は気に入らない!
ここでコンパイラの正しい質問:

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

ああ..そしてメイクファイル。

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

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

および26317.def。これは既にコンパイラーに存在しているはずです

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

はい、誰かが-Eを使用して正しい前処理の答えを出力できますが、-Eを知っていれば、平方根の方法も知っています。:Pここにいくつかの前処理があります。非常に貧弱な最小限のソリューション、バインドされたチェック、プロンプトなし。トライグラフが前処理されることまで。

# 1 "26317.cpp"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "./26317.def" 1
# 1 "<command-line>" 2
# 1 "26317.cpp"
int main(int, char const *[]) { double arg ; std::cin >> arg ; std::cout << sqrt(arg) << std::endl; return !!0;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.