标签:Chapter SEU clock double chrono Mooc step max include
Mooc 课程:程序设计基础——发现计算之美
李骏扬 、魏海坤 、仰燕兰 、朱蔚萍 、杨万扣
网址:https://www.icourse163.org/course/SEU-1003771004
题目
一张边长为 a 的正方形纸张,如下图所示,裁去四角边长为 h 的正方形,然后折成一个开口的长方体,请问,h取值多少,该长方体体积最大?
程序
#include <iostream>
#include <cmath>
#include <chrono>
#include <Windows.h>
using namespace std;
using namespace chrono;
inline double V(double a, double x)
{
return pow(a - 2 * x, 2) * x;
}
/**
* Way 1
* The maximum is the value that is larger than numbers beside.
* complicated and not so accurate
*/
double Way1(double a)
{
double step = a / 1E5;
double max_V = 0;
double max_i = 0;
for (double i = 0; i < a; i += step)
{
if ((V(a, i) - V(a, i - step) >= 0) && (V(a, i) - V(a, i + step) >= 0) && V(a, i) > max_i)
{
max_V = V(a, i);
max_i = i;
}
}
return max_i;
}
/**
* Way 2
* Use the derivative to find the maximum.
* easy, quick and accurate
*/
double Way2(double a)
{
return a / 6;
}
int main(int argc, char** argv)
{
double a;
cin >> a;
auto init_time = chrono::system_clock::now();
cout << "Way 1: x = " << Way1(a) << ", Time cost: " << duration_cast<nanoseconds>(system_clock::now() - init_time).count() << "ns" << endl;
init_time = chrono::system_clock::now();
cout << "Way 2: x = " << Way2(a) << ", Time cost: " << duration_cast<nanoseconds>(system_clock::now() - init_time).count() << "ns" << endl;
return 0;
}
输出示例
分析
数值法
直接求导数简单啊!
获取系统时间
如果使用ctime
库里的clock()
函数,只能精确到毫秒,有时候不够用。
此时出使用C++/11中定义的库chrono
,要using namespace chrono;
。
(Windows/精确到1E-7s)
此处duration_cast
的类型是nanoseconds
(纳秒),也可以调成microseconds
(微秒)。
ALL RIGHTS RESERVED © 2020 Teddy van Jerry
欢迎转载,转载请注明出处。
See also
标签:Chapter,SEU,clock,double,chrono,Mooc,step,max,include
来源: https://blog.csdn.net/weixin_50012998/article/details/111466103
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。