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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pi计算器程序每次运行时都会提供不同的输出相关的知识,希望对你有一定的参考价值。

这是一个使用“任何两个整数的共同素数为6 /π2的概率”这一事实来计算Pi值的程序。这个程序编译成功,但是当我尝试运行它时,它会给出错误:

Segmentation fault (core dumped)

我试图将for循环中的条件语句更改为i <9999。通过执行此操作,程序提供的输出在3.000000,3.162278和Segmentation fault(核心转储)之间变化(每次运行时)。

我想通过使用上面提到的属性来计算π的值。请帮忙。

另外,帮我选择一个更好的函数来生成随机数,并建议我改进一些代码。谢谢。

#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("%f
", 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("%f
", pi);
  return 0;
}

产量

3.142940

以上是关于Pi计算器程序每次运行时都会提供不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

每次我使用 scikit 运行线性回归时都会得到不同的结果

Python 类为每次执行的@property 提供不同的输出

每次运行我在 SQL Impala 中使用前导函数时都会得到不同的结果

每次我尝试在我的 android 设备中运行代码时都会收到此错误。我是应用程序开发的初学者。我正在使用 VScode

viewDidLoad 中的代码每次调用时都会运行

App Engine:每次关闭计算机时都会清除开发数据存储区。如何避免这种情况?