计算圆周率的c语言代码
时间: 2023-10-16 19:11:39 浏览: 305
当然,下面是一个简单的C语言代码来计算圆周率(π)的近似值:
```c
#include <stdio.h>
double calculatePi(int iterations) {
double pi = 0.0;
int sign = 1;
for (int i = 0; i < iterations; i++) {
pi += sign * 4.0 / (2 * i + 1);
sign *= -1;
}
return pi;
}
int main() {
int iterations;
printf("请输入迭代次数:");
scanf("%d", &iterations);
double pi = calculatePi(iterations);
printf("近似圆周率值为:%f\n", pi);
return 0;
}
```
在上面的代码中,我们使用了Leibniz级数来近似计算圆周率。通过迭代的方式,我们不断增加级数的项数以提高近似精度。你可以通过输入迭代次数来控制精度水平。请注意,这只是一种简单的近似方法,实际上计算圆周率需要更复杂和精确的算法。
相关问题
用蒙特卡洛计算圆周率c语言
下面是用蒙特卡洛方法计算圆周率的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int n = 1000000; // 抛点的总数
int count = 0; // 落在圆内的点数
double x, y; // 抛点的坐标
srand(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.0) { // 判断是否在圆内
count++;
}
}
double pi = 4.0 * count / n; // 计算圆周率
printf("pi = %f\n", pi);
return 0;
}
```
该程序抛出 $n$ 个点,坐标随机生成在正方形区域 $[0,1) \times [0,1)$ 内,通过计算落在圆内的点数 $count$,再根据圆的面积公式 $S=\pi r^2$,其中 $r=1$,可以得到圆周率 $\pi$ 的近似值 $\pi \approx 4 \times \frac{count}{n}$。
用多线程的方式求圆周率C语言代码
以下是一个使用多线程并行计算圆周率的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define THREAD_NUM 4 // 线程数
#define POINTS_PER_THREAD 1000000 // 每个线程生成的点数
int total_points = POINTS_PER_THREAD * THREAD_NUM; // 总点数
int points_in_circle = 0; // 落在圆内的点数
pthread_mutex_t lock; // 互斥锁,用于保证数据一致性
void *monte_carlo(void *arg) {
int i, count = 0;
double x, y;
unsigned int seed = rand();
for (i = 0; i < POINTS_PER_THREAD; i++) {
x = (double) rand_r(&seed) / RAND_MAX * 2 - 1;
y = (double) rand_r(&seed) / RAND_MAX * 2 - 1;
if (x * x + y * y <= 1) {
count++;
}
}
pthread_mutex_lock(&lock);
points_in_circle += count;
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}
int main() {
int i, ret;
pthread_t threads[THREAD_NUM];
// 初始化互斥锁
pthread_mutex_init(&lock, NULL);
// 创建线程
for (i = 0; i < THREAD_NUM; i++) {
ret = pthread_create(&threads[i], NULL, monte_carlo, NULL);
if (ret) {
printf("Error: 创建线程失败\n");
exit(-1);
}
}
// 等待线程完成
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
// 计算圆周率
double pi = 4.0 * points_in_circle / total_points;
printf("圆周率的估计值为 %f\n", pi);
// 销毁互斥锁
pthread_mutex_destroy(&lock);
return 0;
}
```
在该代码中,首先定义了线程数和每个线程生成的点数,然后计算出总点数和落在圆内的点数。接着,定义了互斥锁 `lock`,用于保证数据的一致性。在 `monte_carlo` 函数中,生成指定数量的随机点,并统计落在圆内的点数,最后使用互斥锁将线程计算出的结果累加到 `points_in_circle` 中。在 `main` 函数中,创建多个线程并等待它们完成,最后计算估计的圆周率。
阅读全文