有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 822|回复: 10
收起左侧

[普通教程] 踢馆帝原创小测试,第二题!

 关闭 [复制链接]

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

9

主题

11

好友

1118

积分

Continue

积分
1118
发表于 2012-4-12 19:50:48 | 显示全部楼层 |阅读模式
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

81

主题

92

好友

2万

积分

第一章

去哪里找比我更懒得

积分
28955
发表于 2012-4-12 19:52:19 | 显示全部楼层
竟然不能用sqrt。。。
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

7

好友

1万

积分

第一章

积分
10526
发表于 2012-4-12 20:15:51 | 显示全部楼层
本帖最后由 ZeroWinte 于 2012-4-12 20:33 编辑


                               
登录/注册后可看大图
  1. using System;

  2. namespace ConsoleApplication2
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {
  8.             double e = 0.0;
  9.             e=Math.Pow((double)(1 + 1 / 100000000.0), 100000000.0);
  10.             Console.WriteLine("e={0}",e);
  11.             double t = 0.0;
  12.             t = 1.3;
  13.             double a = 0.0;
  14.             while (Math.Abs(t - a) > 0.0001)
  15.             {
  16.                 a = t;
  17.                 t=t + 0.5 * (e / t - t);
  18.             }
  19.             Console.WriteLine("sqrt(e)={0}", t);
  20.             Console.ReadKey();
  21.         }
  22.     }
  23. }
复制代码
e=lim0->∞(1+1/x)^x   精度要求也不是很高所以取个大一点的数就可以了。
开方:
计算公式
X(n+1)=Xn+( (A/Xn) - Xn ) * 1/2

A是要开方的数。
1,给x一个初始值,(我用变量t代x)
2,记录x的值,(变量a)
3,将x代入公式计算,并把结果赋给x
4,比较x和a(差值越小就越接近精确值)
5,若差值较大,返回第2步
6,输出结果x
(一开始代入错误的值也没关系)。

其实我公式是从度娘来的:http://baike.baidu.com/view/1188043.htm




签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

9

主题

11

好友

1118

积分

Continue

积分
1118
 楼主| 发表于 2012-4-12 20:22:48 | 显示全部楼层

简述一下算法,方便大家交流
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-4-12 20:26:12 | 显示全部楼层
本帖最后由 秋声赋 于 2012-4-12 20:33 编辑

C#

                               
登录/注册后可看大图


e=1+1+1/2!+1/3!+…+1/n!+
开方是网上看的...
  1. private void button2_Click(object sender, EventArgs ef)
  2.         {
  3.             double e = 1f;            
  4.             int i = 1;
  5.             do
  6.             {
  7.                 double temp=1;
  8.                 for (int j = 1; j <= i; j++)
  9.                 {
  10.                     temp *= j;
  11.                 }
  12.                
  13.                 e += 1.0/temp;
  14.                 i++;
  15.             }
  16.             while(!(i==10));
  17.             double x1 = e/2;
  18.             double x2 = (x1+e/x1)/2;

  19.             do
  20.             {
  21.                 x1 = x2;
  22.                 x2 = (x1 + e / x1) / 2;
  23.             } while (Math.Abs(x1 - x2) >= 0.01);

  24.             MessageBox.Show(x1.ToString());
  25.         }
复制代码
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

8

主题

11

好友

3239

积分

序章

积分
3239
发表于 2012-4-12 21:10:07 | 显示全部楼层
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace ConsoleApplication3
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {

  11. float es = 1, b = 1, c = 1,d=0,k=0,s=0;
  12. int i;
  13. for (i = 0; i < 50;i++ )
  14. {

  15. c = c * b;
  16. es = es + (1 / c);
  17. b++;
  18. }
  19. Console.WriteLine("e=" + es.ToString() + "\n");

  20. if (es > 1)
  21. { k = 1; d = 0.00001F; }
  22. if (es > 0 & es<1)
  23. { k = 1; d = -0.00001F; }
  24. if (es == 0)
  25. { k = 0; d = 0; }
  26. if (es < 0 & es>-1)
  27. { k = -1; d = 0.00001F; }
  28. if (es < -1)
  29. { k = -1; d = -0.00001F; }

  30. s = k;
  31. for (i = 0; i < 100000; i++)
  32. {
  33. s = s + d;
  34. if (Math.Abs(s * s - es) < 0.001)
  35. {break;}

  36. }
  37. Console.WriteLine("x=" + s.ToString() + "\n");
  38. Console.ReadLine();
  39. }
  40. }
  41. }
复制代码
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
发表于 2012-4-12 23:53:58 | 显示全部楼层
本帖最后由 LonghronShen 于 2012-4-13 00:06 编辑

// Learn more about F# at http://fsharp.net
#light
open System
let sqrtfloat( x:double ):double =
    let mutable g0 = 0.0
    let mutable g1 = 0.0
   
    if x = 0.0 then
        0.0
    else
        g0 <- x / 2.0
        g1 <- (g0 + x / g0) / 2.0
        while Math.Abs(g1 - g0) > 0.01 do
            g0 <- g1   
            g1 <- (g0 + (x / g0)) / 2.0   
        g1
let e =
    let mutable sum:double = 0.0
    let multiplicativeInverse(x:double) = 1.0 / x
    let rec factorial(n:double):double =
        if n = 0.0 then
            1.0
        else
            n * factorial(n - 1.0)
   
    for i = 0 to 10 do
        sum <- sum + ((double i) |> factorial |>multiplicativeInverse)
    sum
Console.WriteLine(e)
Console.WriteLine(sqrtfloat(e))
let ignore = System.Console.ReadKey(false)

                               
登录/注册后可看大图

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

好友

1715

积分

Continue

积分
1715
发表于 2012-4-15 00:52:26 | 显示全部楼层
本帖最后由 romanosovsky 于 2012-4-15 18:01 编辑

我也来一发。Ruby代码
  1. pow=sqrt_e=1.0
  2. e=(1..10).inject{|sum, x|sum + (pow/=x)}+1
  3. sqrt_e=(e/sqrt_e+sqrt_e)/2 until (sqrt_e*sqrt_e-e).abs<Float::EPSILON
  4. p e, sqrt_e
复制代码
泰勒公式求e,牛顿迭代开根号。没有用(1+1/x)^x的办法来求e,因为这样不太准确而且其实内部应该还是调用了exp来实现
结果。

                               
登录/注册后可看大图


note: 原来的第2行:e=(1..10).map{|x|pow *= 1.0/x}.inject{|sum, x|sum + x}+1 多了一次迭代。已修改(@花晴兰)
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

28

主题

103

好友

9783

积分

技术宅认证程序员

苦逼,受剥削人民

积分
9783
发表于 2012-4-15 18:12:44 | 显示全部楼层
romanosovsky 发表于 2012-4-15 00:52
我也来一发。Ruby代码泰勒公式求e,牛顿迭代开根号。没有用(1+1/x)^x的办法来求e,因为这样不太准确而且其 ...

这Ruby的代码也略短了点吧。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
发表于 2012-4-15 20:47:00 | 显示全部楼层
秋声赋 发表于 2012-4-15 18:12
这Ruby的代码也略短了点吧。。

拼代码长度,Ruby笑而不语……
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

好友

3402

积分

序章

积分
3402
发表于 2012-5-14 08:47:09 | 显示全部楼层
本帖最后由 johnnyworm 于 2012-5-14 09:32 编辑
LonghronShen 发表于 2012-4-15 20:47
拼代码长度,Ruby笑而不语……

膜拜下Ruby……看到如此短的代码实在是忍不住想比一下……奈何熟悉的java完全不在一个档次上= =只能祭出才学没多久的python了……
计算方法是一样的……

[mw_shl_code=python,true]f = lambda x: x and x * f(x - 1) or 1
e = reduce(lambda x,y:x + 1.0/f(y), range(1,10)) + 1
sqrt_e = lambda x,y: abs((x + e/x)/2-x)>y and sqrt_e((x + e/x)/2, y) or x
print e, sqrt_e(1.0, 0.0001)[/mw_shl_code]

结果:2.71828152557 1.64876387193
懒得弄图了……

附:java版
[mw_shl_code=java,true]public class Test{
  public static void main(String[] args){
    double e = 1.0, sqrt_e = 1.0;
    int  f = 1;
    for (int i = 1; i <= 10; i++){
      f *= i;
      e += 1.0 / f;
    }
    while(Math.abs(sqrt_e-(sqrt_e=(sqrt_e+e/sqrt_e)/2))>0.0001){   
    }
    System.out.println(e+" "+ sqrt_e);
  }
}[/mw_shl_code]

结果:2.7182818011463845 1.648721262969893

再附:python看上去比较正常版

[mw_shl_code=python,true]e = sqrt_e = f = 1.0
for i in range(1,10):
  f *= i
  e += 1.0/f
while abs(sqrt_e - (sqrt_e + e/sqrt_e)/2)>0.0001:
  sqrt_e = (sqrt_e + e/sqrt_e)/2
print e, sqrt_e[/mw_shl_code]
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(基宅) ( 粤ICP备18082987号-1 | 浙公网安备 33010902001746号 )

GMT+8, 2024-4-20 10:12 , Processed in 0.367036 second(s), 33 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表