蒙地卡罗法求 PI】的更多相关文章

问题: 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名.蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式. 算法说明: 蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值:假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1,如下图所示: 其中c为落在圆中的次数,n为落在正方形中的次数 代码如下: /* 问题:…
/* 蒙地卡罗法求PI 说明 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名.蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机 率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式.解法 蒙地卡罗的解法适用于与面积有关 的题目,例如求PI值或椭圆面积,这边介绍如何求PI值:假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就 为1,如下图所示: !!!这里缺图 如果随意的在正方形中投射飞标(点)好了…
题目说明: 蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名.蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式. 题目解析: 蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值:假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1,如下图所示: 如果随意的在正方形中投射飞标(点)好了,则这些飞标(点)有些会落于四分…
用OpenMP并行化求pi的代码,这里用的是公式法求pi.具体如下: //公式法 #include<omp.h> #include<stdio.h> #include<stdlib.h> #define n_threads 2 //这里线程数设为2 static int num_steps = 10000000; //步数 int main() { int i; double sum = 0.0; double x; double pi; double factor;…
PAT 乙级 1007. 素数对猜想 (20) c++ 筛选法求素数 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的素数". 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数. 输入格式:每个测试输入包含1个测试用例,给出正整数N. 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数.…
//编写一个C++程序求PI的值 /* PI=16arctan(1/5)-4arctan(1/239) 其中arctan用如下形式的极数计算: arctan=x-(x^3/3)+(x^5/7)-(x^7/7)+... */ #include<iostream> using namespace std; double arctan(double x){ double sqr = x*x; double e = x; ; ; ){ double f = e/i; r = (i%==)?r+f:r-…
题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数因子个数为k的二维数组sumNum[n][k]. factorNum能够由筛选法确定.初始化数组为0. 1. 从小到大遍历给定最大范围内的数,若遍历到数n时,factorNum[n]=0则说明这个数是素数(前面没有它的因子). 2. 然后通过添加n的倍数,来筛选出最大范围内含有素数因子n的数. sumNu…
POJ:3006 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. 筛选法求素数的大概思路是: 如果a这个数是一个质数,则n*a不是质数. 用一个数组实现就是: memset(prime,true,sizeof(prime)); if (prime[i]) prime[i*j]=false; 部分程序如下:(朴素) ; ]; memset(prime,true,sizeof(prime)); ; i <= ::max ; i ++ ) { ; j <=…
关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } 证明: 对于a,b,有a = kb + r  (a , k , b , r 均为整数),其中r = a mod b . 令d为a和b的一个公约数,则d|a,d|b(即a.b都被d整除), 那么 r =a - kb ,两边同时除以d 得 r/d = a/d - kb/d = m (m为整数,因为r也…
PTA 7-50 近似求PI 网友代码: include <stdio.h> int main(){ , i, temp=; scanf("%le", &eps); ; temp>eps; i++){ temp = temp*i/(*i+); sum += temp; } printf(*sum); ; } 我的代码: include<stdio.h> int main() { ,fm=,k=; double t=1.0,pi=1.0,eps; s…
MATLAB用二分法.不动点迭代法及Newton迭代(切线)法求非线性方程的根 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验原理 二.实验步骤 三.实验过程 1.(程序) (1)二分法:求   在区间(1,2)之间的根,取 (a)bipart.m: function [x,m]=bipart(fun,a0,b0,tol) a=a0;b=b0; m=1+round(round(log((b-a)/tol))/log(2)); for k=1…
素数:一个数只能被1和它本身整除的数.2是最小的素数 #include <iostream> using namespace std; #define NUM 100 ]; int main() { //筛选法求素数 //假设所有的素数都是素数,标志位设为1 ; i <= NUM ; i++){ isPrime[i] = ; } // 首先去除当前数的倍数.例如当前数为2,那么去除4,6,8等等 ; i <= NUM ; i++){ if(isPrime[i]){ //将相应的标志…
快排法求第k大,复杂度为O(n) import com.sun.media.sound.SoftTuning; import java.util.Arrays; import java.util.Random; public class Main { int[] generate(int n) { Random random = new Random(); int[] a = new int[n]; for (int i = 0; i < a.length; i++) { a[i] = rand…
原文地址: http://blog.csdn.net/qustmeng/article/details/52186378?locationNum=4&fps=1 import java.util.LinkedList; import java.util.List;  public class Demo {     /**      * 二次指数平滑法求预测值      * @param list 基础数据集合      * @param year 未来第几期      * @param modu…
How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14685    Accepted Submission(s): 5554 Problem Description There are n houses in the village and some bidirectional roads connecting…
Best Solver Problem's Link Mean: 给出x和M,求:(5+2√6)^(1+2x)的值.x<2^32,M<=46337. analyse: 这题需要用到高中的数学知识点:特征根法求递推数列通项公式. 方法是这样的: 对于这题的解法: 记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10 根据韦达定理可以推导出:λ1,λ2的特征方程为 x^2-10x+1=0 根据λ1=5+2√6,λ2=5-2√6是特征方程x^2-10x+1=0的解,可以求出:b=-…
来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"string.h" #include"math.h" #define M 50006 #define eps 1e-10 #include"stdlib.h" #define inf 999999999 typedef struct node { double x,…
2421: C语言习题 矩形法求定积分 时间限制: 1 Sec  内存限制: 128 MB 提交: 354  解决: 234 题目描述 写一个用矩形法求定积分的通用函数,分别求 (说明: sin,cos,exp已在系统的数学函数库中,程序开头要用#include<cmath>). 输入 输入求sin(x) 定积分的下限和上限  输入求cos(x) 定积分的下限和上限 输入求exp(x) 定积分的下限和上限 输出 求出sin(x)的定积分  求出cos(x)的定积分  求出exp(x)的定积分…
倍增法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 倍增法是通过一个数组来实现直接找到一个节点的某个祖先,这样我们就可以在O(logn)的时间内求出求出任意节点的任意祖先. 然后先把两个节点中转化为深度相同的节点,然后一起向上递增,知道找到相同的节点,该节点就是这两个节点的最近公共祖先. 代码实现: #include<cstdio> #include<iostream> #define N 42000…
1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减…
倍增法求lca(最近公共祖先) 基本上每篇博客都会有参考文章,一是弥补不足,二是这本身也是我学习过程中找到的觉得好的资料 思路: 大致上算法的思路是这样发展来的. 想到求两个结点的最小公共祖先,我们可以先把两个的深度提到同一水平,在一步一步往上跳,直到两个结点有了一个公共祖先,依照算法流程,这就是least common ancestor. 但是如果这样一步步地往上未免太让人着急,为了提高一下效率,便不再每次只跳一步,而跳\(2^i\)步.一般的,先这样蹦蹦跳跳跳上去直到两个结点相平,在两个一起…
2019-ACM-ICPC-南昌区网络赛-H. The Nth Item-特征根法求通项公式+二次剩余+欧拉降幂 [Problem Description] ​ 已知\(f(n)=3\cdot f(n-1)+2\cdot f(n-2),(n\ge 2)\),求\(f(n)\pmod {998244353}\). [Solution] ​ 利用特征根法求得通项公式为\(a_n=\frac{\sqrt{17}}{17}\cdot\Bigg(\Big(\frac{3+\sqrt{17}}{2} \Bi…
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h> #include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int n,dp[110][110]; memset(dp,0,sizeof(dp))…
// 递归法求中缀表达式的值,O(n^2) int calc(int l, int r) { // 寻找未被任何括号包含的最后一个加减号 for (int i = r, j = 0; i >= l; i--) { if (s[i] == '(') j++; if (s[i] == ')') j--; if (j == 0 && s[i] == '+') return calc(l, i - 1) + calc(i + 1, r); if (j == 0 && s[i]…
要点: 首先对于任何方程 :f(x)=0 ,可以转换成 f(x)+x-x => f(x)+x=x; 取g(x)=f(x)+x;  那么 新方程g(x)=x 的解即是 f(x)=0的解,即g(x)-x=0 成立时有 f(x)+x-x=0 现在研究g(x)=x 的解,该方程的解对应 函数 y=g(x) 与 函数y=x的交点(x1,y1)的x坐标即x1. 函数y=x 是对称直线,上面的的任意点(xa,ya)有xa=ya. picard 方法的具体过程是,选任意x=x0(当然实际上是有条件的,见教程例9…
不多说了,直接上代码,代码中有注释,应该不难看懂. #include <stdlib.h> #include <stdio.h> typedef char ELE_TYPE; #define ELE_FMT "%c" //元素类型和格式符号使用宏定义,很容易改为其他数据类型,如数组类型改为int,则格式符改为"%d ". void printCombo(int idx_arr[], ELE_TYPE eArr[],int m) { int i…
画一个边长为r的正方形和半径为r的四分之一的圆(如下图所示),向上面随机投掷飞镖,通过计算落在星星区域和整体区域的飞镖比例,即可求出π值. 公式推导如下: 假设正方形的边长r为1,那么飞镖落在星星区域内的任意点(x, y),其坐标的平方相加值(x2+y2)必然小于1. 代码如下: import random def find_pi(num_of_times): #num_of_times为投掷飞镖的次数 num1,num2=0,0 #num1为飞镖投掷在星星区域内的次数,num2为飞镖投掷在圆点…
一:分析: 大一学习积分的时候,我们学习过,可以通过矩形法来求定积分. 思路就是将积分区间划分成n等份,然后将这n等份近似看成矩形(或梯形),然后对所有的矩形(或梯形)的面积进行求和. 二:简单的例子 求函数X^2在的定积分 矩形法: #include<iostream> #include<math.h> using namespace std; int main(){ float fun(float x); float a, b; cout << "请输入函…
求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13  红色为删除的元素 第一轮 2的倍数: 2 3 5 7 9 11 13 第二轮 3的倍数: 2 4 5 7 13 第三轮 5的倍数: 2 4 5 7 13 ..... #include<iostream> using namespace std; int main() { int n,i,j; cin &…
一.欧几里得算法及其证明 1.定义: 欧几里得算法又称辗转相除法,用于求两数的最大公约数,计算公式为GCD(a,b)=GCD(b,a%b): 2.证明: 设x为两整数a,b(a>=b)的最大公约数,那么x|a,x|b; ①由整数除法具有传递性(若x能整除a,x能整除b,那么x可整除a,b的任意线性组合)知x|a-b; ②设x不是b的因子,则x不是b和a-b的公因子:设x不是a的因子,则x不是b和a-b的公因子:所以可以得出GCD(a,b)=GCD(b,a-b); ③由a>=b知,a可表示为a=…