首页 > 其他分享 >这道小学六年级的数学题,恕我直言没几个人会做

这道小学六年级的数学题,恕我直言没几个人会做

时间:2022-11-28 18:09:28浏览次数:47  
标签:cnt 人会 res CUDA ull double test 数学题 恕我直言

今天网上冲浪的时候突然看到一道小学六年级的数学题,如上图所示,求阴影部分的面积。

我下意识就想到了微积分,这不就建立坐标系,求出交点,计算积分就行了嘛。转念一想,小学生哪里会积分,这道题一定有简单的解法。

经过一番努力,我尝试出了一共两种精确解法和一种近似解法,但都超出了小学生的理解范畴。

首先我们把图左右翻转一下,方便建立坐标系,如下图所示:


积分方法

首先联立半圆和对角线的方程:

这道小学六年级的数学题,恕我直言没几个人会做_activiti

解出交点E的坐标是

这道小学六年级的数学题,恕我直言没几个人会做_机器学习_02


所以可以直接求下面积分,得到要求的阴影面积:

这道小学六年级的数学题,恕我直言没几个人会做_cuda_03


利用简单的高等数学知识,可以解出答案是下面这样的,约等于1.252。

这道小学六年级的数学题,恕我直言没几个人会做_activiti_04


但是小学生肯定不会积分呀,就算高中生大多数都不会!

间接计算

既然我们不方便算这个不规则图形的面积,我们可以计算其他规则图形的面积,然后加减之后间接得到答案。

图中阴影部分面积其实等价于三角形ACE+梯形BOCE-扇形BOE,而这三部分其实都非常好算。

因为E的坐标是

这道小学六年级的数学题,恕我直言没几个人会做_cuda_05

,所以最难算的就是扇形BOE的面积,也就是要求角OBE的大小。很轻松就可以得到角度是

这道小学六年级的数学题,恕我直言没几个人会做_机器学习_06

,所以三部分运算后可以得到和上面积分相同的答案。


这个方法初中生都会做了!但是对于小学生来说难度还是有点大了。

蒙特卡洛采样方法

如果往第一象限正方形内随机抛撒若干豆子,然后看掉落在阴影部分里的豆子所占的比例,那么就可以近似估计出阴影部分的面积了,这就叫蒙特卡洛采样。

那我们可以随机生成两个随机数,作为采样点的坐标,然后判断是否在阴影部分里,重复上述过程,记录次数就行了。

我这里写了C++和CUDA两个实现,CUDA可以并行采样,速度快很多。

执行的话,C++保存为​​test.cpp​​​,然后执行​​g++ test.cpp -o test​​​和​​./test​​​。CUDA保存为​​test.cu​​​,然后执行​​nvcc test.cu -o test​​​和​​./test​​。

实测CUDA相同时间内可以采样的次数大约是100倍左右,主要受到原子写操作的局限,不然可以达到1000倍左右的加速。

但是小学生会CUDA吗?显然不可能。

C++实现

#include <iostream>

typedef unsigned long long int ull;

int main() {
srand(time(NULL));
ull res = 0;
ull cnt = 1e8;
for (ull i = 0; i < cnt; ++i) {
double x = double(rand()) / RAND_MAX;
double y = double(rand()) / RAND_MAX;
if (x * x + (y - 1) * (y - 1) > 1 && x + 2 * y - 1 < 0) {
res += 1;
}
}
printf("%.5f\n", res * 16.0 / cnt);
return 0;
}

CUDA实现

#include <iostream>
#include <chrono>
#include <curand_kernel.h>

typedef unsigned long long int ull;

__global__ void monte_carlo_kernel(ull* res, ull cnt, const int seed) {
ull i = blockIdx.x * blockDim.x + threadIdx.x;
if (i >= cnt) return;
curandStatePhilox4_32_10_t state;
curand_init(seed, i, 0, &state);
double2 rand = curand_uniform2_double(&state);
double x = rand.x;
double y = rand.y;
if (x * x + (y - 1) * (y - 1) > 1 && x + 2 * y - 1 < 0) {
atomicAdd(res, 1);
}
}

void launch_monte_carlo(ull* res, ull cnt, cudaStream_t& stream) {
ull grid_dim = cnt >> 10;
monte_carlo_kernel<<<grid_dim + 1, 1024, 0, stream>>>(
res, cnt,
std::chrono::duration_cast<std::chrono::microseconds>(
std::chrono::system_clock::now().time_since_epoch())
.count());
}

int main() {
ull* res;
cudaMallocManaged(&res, sizeof(ull));
res[0] = 0;
ull cnt = 1e10;
cudaStream_t stream;
cudaStreamCreate(&stream);
launch_monte_carlo(res, cnt, stream);
cudaDeviceSynchronize();
printf("%.5f\n", res[0] * 16.0 / cnt);
cudaFree(res);
return 0;
}

标准方法

其实标准的小学生解法不需要建坐标系,只需要如下图所示,做4条辅助线就行。

很容易证明,辅助线将三角形ACD划分出来的5个小三角形是全等的。

那么阴影面积就等于正方形AOBD减去四分之一圆BOD,再减去最右侧的弧边三角形ADE。而弧边三角形ADE面积等于三角形ACD减去三角形BCE,再减去扇形BDE。

所以问题的关键就是求角DBE的大小,因为小三角形的边长可以轻易求出,所以最终答案很好算:

这道小学六年级的数学题,恕我直言没几个人会做_gpu_07

可以发现和之前高等数学得到的结果形式并不同,其实数值是一样的,所以我们得到了一个等式:

这道小学六年级的数学题,恕我直言没几个人会做_gpu_08

这个可能看起来不是那么直观,但确实是成立的,根据反三角函数恒等式

这道小学六年级的数学题,恕我直言没几个人会做_activiti_09


总结与拓展

其实这道题小学生也没几个人能做出来,就算给我们做也得费老鼻子劲,还不一定算的对。

最近还看到了很多类似的趣图,这里分享给大家,闲暇时间可以做了玩玩。

可以在评论区说出你的答案哦。

标签:cnt,人会,res,CUDA,ull,double,test,数学题,恕我直言
From: https://blog.51cto.com/godweiyang/5893205

相关文章

  • 浅谈一道数学题
    今天不讲编程知识,谈谈与编程相关的数学。本文使用数学符号:⁰¹²³⁴⁵⁶⁷⁸⁹⁻ⁿ∵∴0123456789+-n因为所以请确认能否正常显示:题......
  • 数学题-长度为5的不同回文子序列
    1930.长度为3的不同回文子序列问题描述给你一个字符串s,返回s中长度为3的不同回文子序列的个数。即便存在多种方法来构建相同的子序列,但相同的子序列只计数一......
  • 俄罗斯总理不为人知的一面,竟然出了一道初中数学题
    文/王不留(微信公众号:王不留)今天讲个很好玩的数学题。不必恐惧,内容均为初中知识。每年的9月1日,是俄罗斯中学、高中以及高校秋季新学年开始的第一天,这天在俄罗斯被称为“知......
  • 【51NOD1847】奇怪的数学题(杜教筛,min_25筛,第二类斯特林数解决自然数幂求和)
    设\(f(n)\)表示\(n\)的次大因数。\[\begin{aligned}&\sum_{i=1}^n\sum_{j=1}^nf(\gcd(i,j))^k\\=&\sum_{d=1}^nf(d)^k\sum_{i=1}^{(n/d)}\sum_{j=1}^{(n/d)}[\gcd(i......
  • 连线问题(数学题)
    题目描述某一天,Alice比较无聊,于是她为自己发明了一个游戏玩。首先她在纸上画了一个圆,然后从这个圆的圆弧上均匀地取出n个点,这n个点将圆n等分。接下来,Alice每次从这......
  • P2737 [USACO4.1]麦香牛块Beef McNuggets 数学题 + 放缩思想
    ​​https://www.luogu.org/problem/show?pid=2737#sub​​先说一个结论:对于两个数p,q,且gcd(p,q)=1(这个很重要,是条件来的)。他们不能组合成的最大的数字是pq-p-q任何......
  • 数据工程师角色的定义,恕我直言。
    数据工程师角色的定义,恕我直言。首先,我知道对于在数据工程领域工作的人来说,标题听起来过于雄心勃勃。对我来说,似乎每家公司对数据工程师的角色都有不同的理解。一些人将其......
  • 数学题三道
    ###T1题目:P1469思路:输出所有数异或的结果就好了。因为异或有如下两个性质:\(x\oplusx=0\)\(x\oplus0=x\)所以全部数的异或和,等同于两两消去相同的数......
  • 关于一个数学题与它的做法
    Description给定\(n\),求\(\sum\limits_{i=1}^n\operatorname{lcm}(i,n)\),多组数据,有\(3e5\)组数据,\(n\le1e6\)。Solution\(\sum\limits_{i=1}^n\operatorn......