こんにちは皆さん、私のクラスでは数値の平方根を作成する必要がありますが、うまくいきません!!
挑戦:
Write a function or program that will "make a number square root".
注:これはコードトローリングです。プログラミングの成功への道をこの新しいプログラマーに導くために、「有用な」答えを与えてください!クリエイティブに!
こんにちは皆さん、私のクラスでは数値の平方根を作成する必要がありますが、うまくいきません!!
挑戦:
Write a function or program that will "make a number square root".
注:これはコードトローリングです。プログラミングの成功への道をこの新しいプログラマーに導くために、「有用な」答えを与えてください!クリエイティブに!
回答:
うわー、これは複雑な問題です。私は前に平方根をやったことがありません。平方根を取得しましたが、まだ実行していません。コードをクラスの見栄えを良くすることを忘れないでください。入力した数値の平方根を作成するコードは次のとおりです。
import java
.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax
.swing.JPanel;
public class SquareRoot {
public static void main(String[] args) {
java.util.Scanner scan = new java.util.Scanner(java.lang.System.in);
System.out.print("Please input a number to take the square root of: ");
int num = scan.nextInt();
System.out.print("The answer is: ");
System.out.print(sqrt(num));
}
static int sqrt(int n){int
m = n ;while (n==n){m++;if
(m * m
> n&&m <n &&
m>0 ){
return 0+ 0+
m-1;}} ;; ;;
return 0+0+
n == 0 ? 1+ 1-
m --:--m +0 -0
;}//sqr
private static class System{private static class out{public static void print(String s){}public static void print(int num){
JFrame frame=new JFrame();JPanel panel = new JPanel(){public void paintComponent(Graphics g){super.paintComponent(g);;;;;g.
setColor(new Color(0x964B00));g.fillRect(0,500,3000,3000);g.setColor(new Color(0xCC7722));g.fillRect(700,505,75,75);;;;;;g.
fillRect
(720,450,
36,50);g.
drawLine
(700,581,
690,600);
g.drawLine
(685,600,
665,615);
g.drawLine
(685,600,
695,610);
g.drawLine
(780,581,
795,600);
g.drawLine
(790,600,
775,615);
g.drawLine
(790,600,
810,610);
g.setColor
(Color.
GREEN);g.
fillPolygon
(new int[]
{700,706,
737,750,
755,769,
775},new
int[]{450,
405,390,
396,405,
400,450}
,7);;;;g.
drawString
(""+num,
725,542);
}}; frame.add
(panel );;//;;/
;;; ;;;frame.
setAlwaysOnTop
(true); frame.
setDefaultCloseOperation
(JFrame.DO_NOTHING_ON_CLOSE);
frame.setVisible(true)
;;;;;;;;;}}}}
トロール:
System.out.print
sがに印刷されませんjava.lang.System.out.print
。それらは内部クラスに出力します。最初の2つ(文字列を出力することになっています)は何もしません。2番目:100
)?:0
。同じ理由で入力が負の場合は無限ループで失敗し、入力がの場合は無限ループで失敗します0
。JFrame.DO_NOTHING_ON_CLOSE
トロルのリストから除外したと思います...
setAlwaysOnTop(true)
も言及するのを忘れていました。
良いルートがない場合は、ブルートフォースソリューションが常にあります。
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
(同じビットサイズのunion
a long long
でそれを実行します)n
。
double
とaの結合long long
は今まで見た中で最も恐ろしいものだ。
union
は未定義の動作であり、関数を使用してdoubleを反復処理することは可能ですstd::nextafter
std::nextafter
あなたが私にそれを言及する前に私は存在していなかったので、ええ、それは欲しかったです。
double
の値が乗算から製造することができないx*x
場所x
でdouble
も、。そのため、検索は時々成功せず(ほとんどの場合)、より正確な結果ではなくNaNが返されます。
次の簡単なコードで正確な答えが得られます。
x = input('Enter a number: ')
print('\u221A{}'.format(x))
√
入力した数字の前に文字を印刷するだけです。
Cが最も速いため、Cを使用する
それは単純に間違っています。誰もが最速のものが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についても繰り返します。
これにより、ほぼ一定数の計算で正確な答えが見つかります。
PCMPEQQ
「コンパイラによって生成される魔法の読めないゴミ」としてあなたに表示されなくなった
「数値の平方根を作成する」関数またはプログラムを作成します。
クラスで許可されている場合は、ここでヘルパーとして複雑な数学ライブラリを使用できます。次のコマンドを実行してインストールします。
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')
(必ず管理者権限で実行してください)
root
Unixlandの場合)。
明らかにこれが最良の方法です。コードを見ると想像できるほど高速です。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];
}
results[number];
?
トリックと魔法が機能します。
#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;
}
それはだ平方根逆高速。
あなたたちはそれをすべて間違っています。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
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
。
残念ながら、JavaScriptは関数名の平方根記号をサポートしていません。代わりに、他のUnicodeアルファベット文字を使用して、平方根関数を表すことができます。
この例では、を使用しますᕂ
。
有効なシンボルを使用したら、Mathオブジェクトを使用して平方根関数を生成できます。
var ᕂ = (function sqrt(_generator_){ return _generator_[arguments.callee.name]; }(Math));
ᕂ(2); // 1.4142135623730951
ᕂ(100); // 10
ᕂ(1337); // 36.565010597564445
それは簡単です!:)
もちろん、使用する方が簡単です
var ᕂ = Math.sqrt;
明らかにそれを行う最良の方法は、平方根のテイラー級数を使用することです。
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
a^2
(n回)で割って(n回)a
答えsqrt(x)~a^n*sqroot(x/a^2n)
を1にしない()x-> 0(a> 0の場合) (大きなエラーを与える)。また、もしX / A ^ 2N〜1の数字a!=x
とn
任意のために変更されますx
たかっpresition(迷惑と時間それらを見つけるためにかかる作る)を取得します。
これに対する解決策はかなり難しく、非常に複雑なので、コーヒーを飲んでください。問題は、コードの平方根をどのような種類の数値にしたいかによって大きく変化することです。問題をお見せします。それ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
:
これが最も効率的な方法です。またPiet
、毎回美しい芸術品をそのまま使用することをお勧めします。そのため、ものがすぐに退屈することはありません。
浮動小数点エラーについて最初に聞いたとき、コンピューターを信頼しなくなりました。真剣に、グーグルでさえそれらを制御できない場合、誰ができるのでしょうか?
したがって、私たちの最善の策は、整数のみを含む解を見つけることです。幸いなことに、すべての間隔[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
ほとんどのアプリケーションでは、精度で十分です。
double
sを使用しており、DDGはtriple
s を使用しています。
これを行う最も正確な方法は、繰り返すことです。まず、integer
ターゲットを超えるまでs でループし、次にdouble
sに切り替えます。この方法には、他の「推定」方法とは異なり、正確であるという利点があります。少し速度を犠牲にしますが、ほとんどのアプリケーションでは、まさにこれが必要です。
必要な精度に応じてこの回答を変更できますが、これは少なくとも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億の倍数をループするには、ある程度時間がかかります。
0.000000001
は、丸め誤差が生じやすいことです。C ++でより正確なソリューションを作成しました。
Math.nextUp(root)
代わりにしないのはなぜ+0.000000001
ですか?それにはもっと時間がかかります...そしてそれは成功することが保証されています。
Double
見つけられなかったときに驚いた。を見るとは思わなかったMath
が、これはかなりうまくいく。私はまだ何も「失敗」していません。
これらのマジック定数を使用して、アルファベットを使用して数値の平方根を計算できます。
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']
非常に難しい問題!
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
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/2 == 0
。
n = input("Enter a number which you want to make a square root: ")
print "\u221A{} = {}".format(n**2, n)
説明
引用
数学では、数値aの平方根は数値yであり、 y 2 = a
言い換えれば、すべての数字は他の数字の平方根です。
注意
私にこの質問はよく知られているパズルに似ています擦ったりカットしたりせずにラインを短くする方法
質問を説明した方法は、実際に計算する必要があることを意味していなかったので、ここに私の解決策があります:
<?
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これまでの言語を!
これらはすべて不正確であるため、他の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
可読性を低下さ√1024
return 3√1024 = ∓32
、これは単純に間違っています)#define the number
...いいね!特に、使用法メッセージを表示する条件についてのあなたの推論が好きでした。
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の教師は、(率直に言って)多くの目的に対して十分に正確なメソッドの速度に感銘を受けます!
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%を超える精度でどのように一貫して回答を提供するかはわかりません。
注:これは私のコンピューター上でのみ機能します。基盤となるハードウェアは、バイナリではなくベースeに数値を格納するため、10
eを100
表す、e eを表すなどのようになります。このようにして、バイナリマシンで左にビットシフトを呼び出すとx => e xが実行され、バイナリマシンで右にビットシフトを呼び出すとx => ln xが実行されます。明らかに、この非常に限られたバイナリ中心のインターネット媒体でその基礎となる数字を表現することは困難ですが、私は最善を尽くします。
Eの構文はC / C ++の構文と非常に似ているため、ほとんどの人が理解しやすいはずです。
double sqrt(double n)
{
return ((n >> 1) / 2) << 1;
}
n >> 1
とは異なりlog(n)
ます。
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;
}
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!
! !
+-----+
注意:ルートは正方形です!!
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が有限数のすべてのシーケンスを含むと信じています。
これは最も正確です(ボーナス:手紙でも機能します!)
Please enter the number :
<script>
$("#b").submit(function()
{
var a = $("#a").val();
a = "√" +a ;
document.write(a);
});
</script>
ここにフィドルがあります
document.write
十分に反するとは思いませんが。
これにより、最終的に平方根が得られます。
#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
ですか?
DBL_EPSILON
。
このソリューション:
合計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)))
質問をコンパイルしないでください!最後に。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;}