|
发表于 2020-8-27 12:07:09
|
显示全部楼层
找圆周率的计算方法,找到这里,用VS2015 顺便测试了一下。
感觉挺有意思,虽然 没看懂,
使用的电脑 计算一次用时不超过50ms
win10 64位
CPU E3-1230 V2@3.30GHz
编辑后的code 重新传了一遍
- // CalculatePI.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "math.h"
- #define NUMBERS 5000
- long long base[NUMBERS / 12 + 10];
- long long calc[NUMBERS / 12 + 10];
- long long result[NUMBERS / 12 + 10];
- void CalculatePI(long long *total, long number)
- {
- long a, i, j, step;
- long array = number / 12 + 3;
- long long remain, q;
- long head, devide, devidedouble, loop, start;
- double ratio;
- for (i = 0; i <= array; i++)
- total[i] = 0;
- for (step = 0; step < 2; step++)
- {
- devide = (!step) ? 5 : 239;
- devidedouble = devide * devide;
- remain = 1;
- for (i = 0; i <= array; i++)
- {
- base[i] = remain / devide;
- // remain=(remain%devide)*1000000000000LL;
- /**/ remain = (remain - base[i] * devide) * 1000000000000LL;
- }
- loop = (long)(number * log(10) / log(devide) + 1);
- ratio = log(devide) / log(10) / 12;
- start;
- for (i = 0; i <= array; i++)
- calc[i] = 0;
- for (j = 1; j <= loop; j++, j++)
- {
- start = (long)(j * ratio);
- remain = 0;
- if (!(j & 2))
- for (i = start; i <= array;)
- {
- a = i;
- // calc+=remain/j;
- // remain=(remain%j)*1000000000000LL+base[++i];
- /**/ q = remain / j;
- /**/ calc[i] += q;
- /**/ remain -= q * j;
- /**/ remain = remain * 1000000000000LL + base[++i];
- while (calc[a] >= 1000000000000LL)
- {
- calc[a] -= 1000000000000LL;
- calc[--a]++;
- }
- }
- else
- for (i = start; i <= array;)
- {
- a = i;
- // calc-=remain/j;
- // remain=(remain%j)*1000000000000LL+base[++i];
- /**/ q = remain / j;
- /**/ calc[i] -= q;
- /**/ remain -= q * j;
- /**/ remain = remain * 1000000000000LL + base[++i];
- while (calc[a] < 0)
- {
- calc[a] += 1000000000000LL;
- calc[--a]--;
- }
- }
- remain = 0;
- if (!step)
- {
- head = j / 12 + 2;
- for (i = start; (i <= array) && (i <= head);)
- {
- base[i] = remain / devidedouble;
- // remain=(remain%devidedouble)*1000000000000LL+base[++i];
- /**/ remain -= base[i] * devidedouble;
- /**/ remain = remain * 1000000000000LL + base[++i];
- }
- }
- else
- for (i = start; i <= array;)
- {
- base[i] = remain / devidedouble;
- // remain=(remain%devidedouble)*1000000000000LL+base[++i];
- /**/ remain -= base[i] * devidedouble;
- /**/ remain = remain * 1000000000000LL + base[++i];
- }
- }
- if (!step)
- {
- total[array] += calc[array] * 16;
- for (i = array - 1; i >= 0; i--)
- {
- total[i] += total[i + 1] / 1000000000000LL + calc[i] * 16;
- total[i + 1] %= 1000000000000LL;
- }
- }
- else
- {
- long long tail;
- total[array] -= calc[array] * 4;
- for (i = array - 1; i >= 0; i--)
- {
- tail = total[i + 1] % 1000000000000LL;
- total[i] += total[i + 1] / 1000000000000LL - ((tail < 0) ? 1 : 0) - calc[i] * 4;
- total[i + 1] = tail + ((tail < 0) ? 1000000000000LL : 0);
- }
- }
- }
- }
- //调用时采用语句:CalculatePI(result, NUMBERS),
- //结果保存在long long型的数组result中,
- //其中result[0]存放的是数字3,
- //result[1]以后的以整数形式存放PI的小数部分,
- //每个整数对应12位的小数。
- int main()
- {
- CalculatePI(result, NUMBERS);
- return 0;
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|