C# 定积分求周长&面积原理 代码达成

发布时间:2019-05-04  栏目:Python  评论:0 Comments

前言:

通过面积求周长……,面积周长……

Description

There is a piece of paper in front of Tom, its length and width are
integer. Tom knows the area of this paper, he wants to know the minimum
perimeter of this paper.  

Input

In the first line, there is an integer T indicates the number of test
cases. In the next T lines, there is only one integer n in every line,
indicates the area of paper. 
$T\leq 10,n\leq {10}^{9}$  

Output

For each case, output a integer, indicates the answer.  

Sample Input

3 2 7 12  

Sample Output

陆 16 14     标题意思:告诉你多少个矩形的面积求他的蝇头周长  
解题思路:能够想到的点子最直白的就是枚举然后比较,可惜的是,那样会超时…….
然后正是一种尤其速的章程。能够思考,当x和y之间的差越小,周长就越小。所以能够用开平方来节省时间。先把面积开平方,开完之后转成整形,然后总括面积是不是能够整除开出来的数,不得以就减1,直到满意整除…..那样就找到了,最小周长的一条边,然后就足以出口最小周长了。
为何说找到的就是纤维周长的一条边呢?
能够这么比喻,当您开平方正是数的找到中式点心,然后向左走,找到的首先个满意整除的便是x和y之间离开最短的一对
  先来叁个逾期的代码吧。     (好自己检查自纠一下)  

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int T;
 6     scanf("%d",&T);
 7     while(T--)
 8     {
 9         int S,sum=10000,k=0;
10         scanf("%d",&S);
11         for(int x=1; x<=S; x++)
12         {
13             if(S%x==0&&sum>=(x+S/x))
14                 sum=x+S/x;
15         }
16         printf("%d\n",2*sum);
17     }
18     return 0;
19 }

 

 

接下去是不超时的代码:

 

 

 1 #include<cstdio>
 2 #include<cmath>
 3 int main()
 4 {
 5     int t,s,n;
 6     scanf("%d",&t);
 7     while(t--)
 8     {
 9         scanf("%d",&s);
10         n=(int)sqrt((double) s);
11         while(s%n)
12            {
13                //printf("%d\n",n);
14                 n--;
15            }
16         n=2*(n+s/n);
17     printf("%d\n",n);
18     }
19 return 0;
20 }

 

http://www.bkjia.com/cjjc/1041086.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1041086.htmlTechArticle通过面积求周长……,面积周长…… Description
There is a piece of paper in front of Tom, its length and width are
integer. Tom knows the area of this paper, he wants…

        
上月,因为做事缘故,接触到了求解曲线周长,真的是搞了很久,学生时代真的非常粗略,可是将来的本人的话,忘记了….过几人跟本身应当一样。

          所以来巩固压实一下记得。一齐先的时候,求周长嘛,找公式呗,什么matlab呀,乱78糟的,晕,最终找到了或许还不可能满足项目标急需,因为可能总括量过大。(作者正是那样子的,灵活性绝对极低)

         
还有正是显著温馨能够用代码完毕,为啥非要插件,工具呐,这么不自信的?

         
所以,“壹怒之下”,自身去看了须臾间定积分求周长的法则,本身或然用代码来贯彻啊。

(以下内容纯是私人住房那段日子的精晓,借使有错误的,招待指正出来。)

 

第3须求说说三个概念,曲线和周长,因为大家渴求她们嘛。

曲线:

  那么些世界,有曲线吗?笔者的答疑是,未有。那…那…曲线是由许四个一直拼接而成。再正确的说过三个比非常的短的曲线拼接而成。

(假诺您透彻领略了那句话,后边就无须看了,基本就没了。)

 

面积:

  与周长的定义类似,未有圆锥形,未有圆形。唯有三角形,全数的图形都以三角形拼接而成。而三个三角形拼成星型,而笔者辈的面积是由众三个星型,拼接而成。

  图片 1

                (定积分原理的参考图)

 

源码完成: 

double GetLength(float start,float end)
        {
            double sumLength = 0;

            float eachX = (end - start) / testCount; 
            for (int i = 1; i < testCount;i++ )
            {

                double curY =ArcFunction(start+eachX*i);
                double previousY = ArcFunction(start+eachX*(i-1));
                //根据c²=a²+b²
                double curLength = Math.Sqrt(Math.Pow(eachX, 2) + Math.Pow(curY - previousY, 2));
                sumLength += curLength;
            }
                return sumLength;
        }

   解释:

            
testCount,即自定义的测试数量,能够知道为精细度,值越大,计算量越大,数据越标准,这么些可看你项目需要精细度,通过该变量

可在完毕最少的总括量景况,实现您要的效果。

    eachX,正是您的曲线被分为N份,每份的长短。

    curY,当前点的y轴分量

    previousY,上三个点的y轴分量,

    curLength,即如图   

    

                                                      
图片 2

                 
(剩余的片段,代码里面含解释,个人爱好放在源码里面,原生的,纯二四k原创)   

 1     int testCount = 1000; //所谓的测试细致度吧,可动态调控,你自己掌握。
 2         /// <summary>
 3         /// 通过已知周长,获取x轴的分量
 4         /// </summary>
 5         /// <param name="length"></param>
 6         /// <returns></returns>
 7         double GetRateXByLength(double length)
 8         {
 9             float eachX = 1.0f;
10             for (int i = 1; i < testCount; i++)
11             {
12                 double curY = ArcFunction(eachX * i);
13                 double previousY = ArcFunction(eachX * (i - 1));
14                 double curLength = Math.Sqrt(Math.Pow(eachX, 2) + Math.Pow(curY - previousY, 2));
15                 length -= curLength;
16                 if(length<=0)
17                 {
18                     return i * eachX;
19                 }
20             }
21             return testCount * eachX;
22         }
23             
24         
25       
26 
27 
28         /// <summary>
29         /// start到end范围内的面积
30         /// </summary>
31         /// <param name="start"></param>
32         /// <param name="end"></param>
33         /// <returns></returns>
34         double GetArea(float start,float end)
35         {
36             double sumAera = 0;
37 
38             float eachX = (end - start) / testCount;
39             for (int i = 1; i < testCount; i++)
40             {
41                 double curY = ArcFunction(start + eachX * i);
42                 //面积 = 长*宽
43                 double curAera = curY * eachX;
44                 sumAera += curAera;
45             }
46             return sumAera;
47         }
48 
49 
50 
51         /// <summary>
52         /// 通过已知面积,获取x轴分量
53         /// </summary>
54         /// <param name="aera"></param>
55         /// <returns></returns>
56         double GetRateXByAera(double aera)
57         {
58             float eachX = 1.0f;
59             for (int i = 1; i < testCount; i++)
60             {
61                 double curY = ArcFunction(eachX * i);
62                 double curAera = curY * eachX;
63                 aera -= curAera;
64                 if(aera<=0)
65                 {
66                     return i * eachX;
67                 }
68             }
69             return testCount*eachX;
70         }
71 
72 
73 
74         /// <summary>
75         /// 通过x分量,得出y的值。(好像意义不大,但是好像可能有些人不是很理解,写给某些人看的,一目了然)
76         /// </summary>
77         /// <param name="x"></param>
78         /// <returns></returns>
79         double GetYByX(float x)
80         {
81             return ArcFunction(x);
82         }
83 
84 
85         /// <summary>
86         /// 核心控制函数。
87         /// </summary>
88         /// <param name="x"></param>
89         /// <returns></returns>
90         double ArcFunction(float x)
91         {
92             return Math.Pow(x, 2); //这边我用幂函数来测试。各位爷可以换其他函数啊。
93 
94             //注:如果对曲线灵活性要求很高,推荐使用贝塞尔曲线。
95             //详情可参考:
96         }

 

 

增补:那边,我对贝塞尔曲线做一下填补吧。因为自个儿因为啥幂函数,指数函数遇到的肯,因为那么些函数毕竟还不是那么灵活,都富有自然“规律”。

贝塞尔曲线的利落,受五个参数调整,八个点呗。(二维空间)

 详细情形可参照那篇:http://www.sohu.com/a/118656687\_466876

 

 

=======================================
2018年9月3日补充================================================================

        能够行使第一方插件:开源Math.Net实行数值积分。

        参考:https://www.cnblogs.com/asxinyu/p/4301017.html     

public static double
OnClosedInterval(Func<double, double> f, double intervalBegin,
double intervalEnd);

 

 

void Start () {
        var result = Integrate.OnClosedInterval(TestFunc, 0, 24);
         Debug.Log(result);
 }

    double TestFunc(double x)
    {
        return x * x;
    }

 

  不过上述的result为面积,也是dy。

 

  再遵照定积分求弧长公式:

          图片 3    

       即:弧长 =
 √(1+result²)    

===================================================================================================================

留下评论

网站地图xml地图