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

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

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

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

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

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

积分方法

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

解出交点E的坐标是

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

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

1685432515575.png

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

间接计算

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

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

因为E的坐标是,所以最难算的就是扇形BOE的面积,也就是要求角OBE的大小。很轻松就可以得到角度是,所以三部分运算后可以得到和上面积分相同的答案。

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

蒙特卡洛采样方法

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

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

我这里写了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的大小,因为小三角形的边长可以轻易求出,所以最终答案很好算:

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

这个可能看起来不是那么直观,但确实是成立的,根据反三角函数恒等式,可以推出等号左边等于。构造一个边长3、4、5的直角三角形,显然答案就是。

总结与拓展

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

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

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

相关文章
|
缓存 并行计算 算法
MPI并行计算的基本介绍和使用
MPI并行计算的基本介绍和使用
839 1
|
机器学习/深度学习 网络协议 异构计算
浅析GPU通信技术(下)-GPUDirect RDMA
目录 浅析GPU通信技术(上)-GPUDirect P2P 浅析GPU通信技术(中)-NVLink 浅析GPU通信技术(下)-GPUDirect RDMA 1. 背景         前两篇文章我们介绍的GPUDirect P2P和NVLink技术可以大大提升GPU服务器单机的GPU通信性...
28420 0
|
6月前
|
存储 人工智能 文件存储
阿里云云存储技术:构建智能时代的数字底座
在数据成为核心资产的时代,阿里云云存储技术为企业提供从数据存储、管理到智能分析的全栈式解决方案。涵盖对象存储(OSS)、块存储、文件存储三大核心服务,支持智能分层、全球加速与数据湖集成等功能。通过极致性能优化、全链路数据安全、绿色低碳存储等六大创新引擎,助力企业实现数字化转型。阿里云云存储不仅满足传统业务需求,还赋能AI训练、混合云灾备、元宇宙等前沿场景,推动数据价值最大化。未来,阿里云将持续探索智能化与无边界化的存储技术,为企业创造更多可能。
526 13
|
存储 机器学习/深度学习 自然语言处理
LangChain与向量数据库:高效的信息检索方案
【8月更文第4天】随着自然语言处理技术的发展,特别是深度学习的进步,我们能够更加高效地处理大量的文本数据。LangChain 作为一种强大的工具链,旨在简化和加速构建复杂的自然语言处理应用程序。结合向量数据库,LangChain 可以实现高效且精准的信息检索功能。本文将探讨这一组合的工作原理,并通过一个具体的实现案例来展示其在实际应用中的效果。
1129 2
|
监控 负载均衡 Java
(九)漫谈分布式之微服务组件篇:探索分布式环境下各核心组件的必要性!
本文将深入探讨微服务中各个组件的必要性,以此帮助各位更好地加深对分布式系统的掌握度。
784 1
|
消息中间件 NoSQL Java
Flink-06 Flink Java 3分钟上手 滚动窗口 时间驱动 Kafka TumblingWindow TimeWindowFunction TumblingProcessing
Flink-06 Flink Java 3分钟上手 滚动窗口 时间驱动 Kafka TumblingWindow TimeWindowFunction TumblingProcessing
190 0
|
运维 前端开发 Unix
用Go实现Ping操作
**摘要:** 本文介绍了 Ping 操作的原理和用途,并展示了如何用 Go 语言实现一个简单的 Ping 工具。Ping 是一个用于测试网络连接可达性和测量往返时间(RTT)的工具,常用于网络故障排查和监测网络稳定性。文中详细讲解了 ICMP 报文的结构,以及如何构建和发送 ICMP 请求报文,包括设置类型、代码、校验和、ID 和序列号等。通过示例代码,演示了如何编写 Go 代码实现 Ping 功能,包括计算校验和、设置超时、发送和接收数据包等步骤。
222 5
|
Java Linux 编译器
编写和使用Linux Makefile
编写和使用Linux Makefile
|
消息中间件 存储 Java
后端开发Spring框架之消息介绍 同步异步 JMS AMQP MQTT Kafka介绍
后端开发Spring框架之消息介绍 同步异步 JMS AMQP MQTT Kafka介绍
154 0
|
Java 关系型数据库 MySQL
JAVA后端学习路线
JAVA后端学习路线
281 0
JAVA后端学习路线