// chp2.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>//数据结构
//数组(Array)、堆栈(Stack)、队列(queue)、链表(Linked List)、树(Tree)、图(Grahp)、堆(Heap)、散列表(Hash)//
// 判断是否为2的n次幂
bool PowofTwo(int n)
{return !(n & (n-1));
}//
// 利用割圆术求pi的近似值, 假设有一个半径是1的圆,第一次切割在其内部内接正六边形。
// 正六边形的变长为y1, 根据几何知识,y1=1, 圆周长近似为L1=6*y1
// 第二次切割,在正六边形的基础上,扩展为12边形时,边长为y2, y2^2=2-sqrt(4-y1^2)
// pi≈3*2^n*yn
double cyclotomic(int n)
{double k, yy;int i;long s;double pi = 0.0f;i = 1; //第一次切割s = 6; //初始为6边形yy = 1.0f;k = 3.0f;while (i<=n){ pi = k*sqrt(yy);printf("第%d次切割,为正%ld多边形,PI近似为%.24f\n", i, s, pi);s *= 2; //边数加倍yy = 2-sqrt(4-yy); //内接多边形的变长的平方值k *= 2.0f; //累积前面的系数3*2^ni++;}return pi;
}//
// 蒙特卡罗算法(Monte Carlo)
// 一个半径为1的圆,他在第一象限的1/4圆面积为pi/4
// 在上面接一个正方形,面积为1,两者相比pi/4, 概率算法
// 随即产生一个点,判断是不是在圆形区域,比上总点数,即为pi/4
double MontePI(int n)
{int sum;double pi;double x, y;sum = 0;srand((unsigned)time(NULL));for (int i=0; i<n; i++){x = (double)rand()/RAND_MAX; //产生0~1的随机数y= (double)rand()/RAND_MAX;if ((x*x + y*y) <= 1)sum++;}pi = 4.0*sum/n;return pi;
}int _tmain(int argc, _TCHAR* argv[])
{int *pnums = new int[100];memset(pnums, 0, 100);srand((unsigned)time(NULL));int num8;int temp;for (int i = 0; i<100; i++){pnums[i] = rand()%500;num8 = (pnums[i] + 0x7)&~0x7; //两种方法将数字提升到8的倍数temp = (pnums[i] + 0x7)/8*8;printf("%d->%d, %d", pnums[i], num8, temp);if (PowofTwo(pnums[i])){printf("--->pow of two");}printf("\n"); //换行}printf("\n\n");//clean:delete[] pnums;////计算pi的近似值printf("计算pi的近似值\n");cyclotomic(12);printf("\n\n");for (int i=1; i<10; i++){printf("Monte Carlo pi = %.24f\n", MontePI(i*1000) );}return 0;
}
392->392, 392
35->40, 40
51->56, 56
72->72, 72
245->248, 248
15->16, 16
158->160, 160
252->256, 256
158->160, 160
122->128, 128
154->160, 160
334->336, 336
82->88, 88
96->96, 96
192->192, 192
101->104, 104
116->120, 120
52->56, 56
94->96, 96
257->264, 264
58->64, 64
70->72, 72
337->344, 344
67->72, 72
382->384, 384
142->144, 144
25->32, 32
492->496, 496
14->16, 16
469->472, 472
217->224, 224
363->368, 368
387->392, 392
317->320, 320
233->240, 240
415->416, 416
199->200, 200
422->424, 424
217->224, 224
472->472, 472
184->184, 184
498->504, 504
92->96, 96
244->248, 248
172->176, 176
44->48, 48
133->136, 136
390->392, 392
440->440, 440
373->376, 376
341->344, 344
246->248, 248
214->216, 216
183->184, 184
465->472, 472
103->104, 104
83->88, 88
123->128, 128
141->144, 144
37->40, 40
71->72, 72
152->152, 152
333->336, 336
257->264, 264
62->64, 64
240->240, 240
170->176, 176
292->296, 296
490->496, 496
139->144, 144
32->32, 32--->pow of two
55->56, 56
190->192, 192
54->56, 56
376->376, 376
163->168, 168
35->40, 40
273->280, 280
233->240, 240
79->80, 80
21->24, 24
436->440, 440
59->64, 64
485->488, 488
4->8, 8--->pow of two
118->120, 120
97->104, 104
123->128, 128
383->384, 384
215->216, 216
482->488, 488
315->320, 320
369->376, 376
433->440, 440
102->104, 104
305->312, 312
290->296, 296
417->424, 424
451->456, 456
363->368, 368
计算pi的近似值
第1次切割,为正6多边形,PI近似为3.000000000000000000000000
第2次切割,为正12多边形,PI近似为3.105828541230249800000000
第3次切割,为正24多边形,PI近似为3.132628613281236900000000
第4次切割,为正48多边形,PI近似为3.139350203046872100000000
第5次切割,为正96多边形,PI近似为3.141031950890529800000000
第6次切割,为正192多边形,PI近似为3.141452472285344300000000
第7次切割,为正384多边形,PI近似为3.141557607911622100000000
第8次切割,为正768多边形,PI近似为3.141583892148935900000000
第9次切割,为正1536多边形,PI近似为3.141590463236761700000000
第10次切割,为正3072多边形,PI近似为3.141592106043048300000000
第11次切割,为正6144多边形,PI近似为3.141592516588154600000000
第12次切割,为正12288多边形,PI近似为3.141592618640789400000000
Monte Carlo pi = 3.192000000000000200000000
Monte Carlo pi = 3.206000000000000000000000
Monte Carlo pi = 3.173333333333333300000000
Monte Carlo pi = 3.141000000000000000000000
Monte Carlo pi = 3.138399999999999900000000
Monte Carlo pi = 3.133999999999999900000000
Monte Carlo pi = 3.129142857142857000000000
Monte Carlo pi = 3.123499999999999900000000
Monte Carlo pi = 3.125777777777778000000000
请按任意键继续. . .