C/C++无聊练手
文章平均质量分 86
间宫羽咲sama
阴阳使徒于黑棺沉眠,无垢明灯于晦明绽放,在无月的天空下觉醒吧!
展开
-
【C/C++无聊练手(四)】用C++模板写一个带迭代器的树状数组,用于求前缀和
最近突发奇想,想到了一个神奇的场景:假设有NNN个人,每个人初始都有111块钱。每次随机给其中一个人111块钱,每个人获得钱的概率和自己当前有的钱数成正比(本来想模拟马太效应),那么最后每个人的钱对应的概率分布是多少?当然,最后仿真结果出来是指数分布,这也很好解释,因为这个过程有无记忆性,但这不是重点,就不多聊了。这里的编程难点在于如何实现让每个人获得钱的概率和自己当前有的钱数成正比,一个暴力的做法就是每次迭代时求一次前缀和得到概率分布函数,然后在随机一个均匀分布的整数,通过。原创 2023-01-16 21:05:30 · 635 阅读 · 1 评论 -
一个60行的C语言FIFO队列的demo
因为需求只需要实现出队和入队操作,不必实现访问操作。只需要实现Pop和Push就行。原创 2022-10-19 23:00:30 · 386 阅读 · 0 评论 -
迭代递推计算均值、方差的无偏估计(含C++实现)
文章目录前言数学推导C++代码实现前言对于一个序列而言,求均值和方差根据定义式是不难的,其时空复杂度均为 O(N)\mathcal{O}\left(N\right)O(N) 。但有的时候,我们的样本是一个一个给的,此时新来了一个样本,我们总不可能把原来的样本都捞出来再算一次均值、方差吧,那样时空复杂度都是 O(N)\mathcal{O}\left(N\right)O(N) 了。因此,我们需要一个递推的方式,假设我们已知前 nnn 个样本的均值和方差 μ^n,σ^n2\hat{\mu}_n, \hat{\原创 2022-05-15 22:46:05 · 1720 阅读 · 1 评论 -
【C/C++无聊练手(三)】计算1/1000000007的循环节(长度为1000000006)
C++代码的空间复杂度优化上面的代码的确能用,时间复杂度是 O(N)\mathcal{O}\left(N\right)O(N) 。然而空间复杂度近似于 5N5N5N ,常数 555 十分大。这使得我们在计算 1000000007 这种十亿级别的输入时,内存会被直接吃完。让我们反思一下,空间复杂度其实分为 N+4NN+4NN+4N ,那 4N4N4N 是因为我们用了 int 类型的 NNN 长度数组来计算循环节长度。如果我们通过质因数分解+欧拉定理的方式简化计算过程,那么 4N4N4N 这部分空间复杂度将原创 2021-10-12 20:57:15 · 515 阅读 · 0 评论 -
【C/C++无聊练手(二)】将质因数分解封装为类+快速幂求幂模函数+代码正确性单元测试(本文作为下文的基础类)
文章目录前言简短的理论介绍前言在上篇文章【C/C++无聊练手(一)】从「计算1/N的循环节」到「计算M/N的循环节」的理论推导&代码实现中,我们对于 1/N1/N1/N 循环节的问题实现了用 C/C++ 的计算。但在文末,笔者留下一个未解决的问题——对于这个代码,其实我们还不够满意。因为只能计算千万级别的输入显然不够coooooool!我们希望挑战一个高难度任务,让我们能计算 1000000007 这种十亿级别的输入。不过我们会遇到一大困难——结果的长度有 1000000006 位,而我们代原创 2021-10-11 15:47:15 · 262 阅读 · 0 评论 -
【C/C++无聊练手(一)】从「计算1/N的循环节」到「计算M/N的循环节」的理论推导&代码实现
文章目录理论分析理论分析分析一个复杂的问题,我们通常考虑它的简单形式,然后推广到一般。我们考虑 1/N1/N1/N 的循环节问题,最简单的方法就是令 NNN 为较小的数,然后观察规律,最终推广。因此,我们先考虑 1/71/71/7 ——1/7=0.1˙4˙2˙8˙5˙7˙(1.1)1/7=0.\dot{1}\dot{4}\dot{2}\dot{8}\dot{5}\dot{7} \tag{1.1}1/7=0.1˙4˙2˙8˙5˙7˙(1.1)考虑到乘以 101010 相当于小数点右移一位,例如1原创 2021-10-10 14:49:49 · 940 阅读 · 0 评论