Pi 计算器程序每次 运行 时都会给出不同的输出
Pi-calculator program gives different output each time it's run
这是一个使用 "The probability of any two integers being co-prime is 6/π2." 这个程序编译成功但是当我尝试 运行 它时,它给出了错误:
Segmentation fault (core dumped)
我试图将for循环中的条件语句更改为i < 9999。通过这样做,程序给出的输出在 3.000000、3.162278 和分段错误(核心已转储)之间变化(每次 运行)。
我只想用上面提到的属性来计算π的值。请帮忙。
此外,帮我选择一个更好的生成随机数的函数,并建议我进行一些代码改进。谢谢。
#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\n", pi);
return 0;
}
OP 的 gcd()
递归太深,导致 堆栈溢出 。
考虑更高效的替换递归函数
做除法时使用 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\n", pi);
return 0;
}
输出
3.142940
这是一个使用 "The probability of any two integers being co-prime is 6/π2." 这个程序编译成功但是当我尝试 运行 它时,它给出了错误:
Segmentation fault (core dumped)
我试图将for循环中的条件语句更改为i < 9999。通过这样做,程序给出的输出在 3.000000、3.162278 和分段错误(核心已转储)之间变化(每次 运行)。
我只想用上面提到的属性来计算π的值。请帮忙。
此外,帮我选择一个更好的生成随机数的函数,并建议我进行一些代码改进。谢谢。
#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\n", pi);
return 0;
}
OP 的 gcd()
递归太深,导致 堆栈溢出 。
考虑更高效的替换递归函数
做除法时使用 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\n", pi);
return 0;
}
输出
3.142940