Pi计算器程序每次运行时都会给出不同的输出



这是一个程序,可以使用以下事实来计算PI的值。"该程序成功地编译了,但是当我尝试运行它时,它会产生错误:

Segmentation fault (core dumped)

我试图将for-loop中的条件语句更改为 i<9999 。通过执行此操作,该程序给出了一个在3.000000、3.162278和分段故障(核心倾倒)之间的输出(每次运行时)。

我想计算&pi的值;仅通过使用上述属性。请帮助。

另外,请帮助我选择一个更好的功能,该功能生成随机数,并建议我一些代码改进。谢谢。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
int gcd(int a, int b)
{
    // Everything divides 0 
    if (a == 0 || b == 0)
       return 0;
    // base case
    if (a == b)
        return a;
    // a is greater
    if (a > b)
        return gcd(a-b, b);
    return gcd(a, b-a);
}
int main()
{
    srand(time(0));
    int numberOne = rand();
    int numberTwo = rand();
    int coprime = 0;
    for(int i = 0; i < 99999; i++)
    {
        numberOne = rand();
        numberTwo = rand();
        if(gcd(numberOne, numberTwo) == 1)
        {
            coprime++;
        }
    }
    // co-prime/99999 = 6 / pi^2
    double pi = 599994/coprime;
    pi = sqrt(pi);
    printf("%fn", pi);
    return 0;
}

op的gcd()递归太深,导致堆栈溢出。@oldprogrammer

考虑更有效

的替代递归函数

执行分区时使用FP数学

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
unsigned gcdu(unsigned a, unsigned b) {
  return (b == 0) ? a : gcdu(b, a % b);
}
int main(void) {
  srand(time(0));
  int numberOne = rand();
  int numberTwo = rand();
  int coprime = 0;
  for (int i = 0; i < 99999; i++) {
    numberOne = rand();
    numberTwo = rand();
    if (gcdu(numberOne, numberTwo) == 1) {
      coprime++;
    }
  }
  // double pi = 599994 / coprime;
  double pi = 1.0*599994 / coprime;  //Insure FP division
  pi = sqrt(pi);
  printf("%fn", pi);
  return 0;
}

输出

3.142940

相关内容

  • 没有找到相关文章