Мне просто кажется, что мой код может быть как-то проще, но я не уверен, как его упростить.
Мне не нравится тот факт, что я использую два цикла while.Мне было интересно, если бы был способ кодировать эту программу, используя только один, а не два, которые я использую в настоящее время
Кажется достаточно просто, чтобы использовать один цикл.
Код OP, while (c < t) loop
, можно заменить на if (c < t)
и достичь того же результата.Цикл выполняется только 1 или 0 раз.С корректировкой начальных значений c
или t
цикл / блок может выполняться ровно один раз каждый раз.Таким образом полностью отменяя тест.
Несколько дополнительных настроек в Viete()
.
#include <stdio.h>
#include <math.h>
double Viete(unsigned n) {
const char *pi = "pi 3.141592653589793238462643383...";
puts(pi);
printf("m_pi=%.17f\n", acos(-1));
double term = sqrt(2.0);
double v = 1.0;
while (n-- > 0) {
v = v * term / 2;
printf("v_pi=%.17f %u\n", 2 / v, n);
term = sqrt(2 + term);
}
puts(pi);
return 2 / v;
}
int op_pi(unsigned n) {
unsigned c = 1;
unsigned t = 0;
unsigned count = 1;
double out = 1;
double x = sqrt(2);
while (count <= n) {
t = t + 1;
// while (c < t) {
// or
if (c < t) {
x = sqrt(2 + x);
c = c + 1;
}
out = out * (x / 2);
count = count + 1;
printf("%lf is the approximation of pi %u\n", 2 / out, count);
}
double approx = 2 / out;
printf("%lf is the approximation of pi\n", approx);
}
int main(void) {
op_pi(5);
Viete(5);
}
Вывод
2.828427 is the approximation of pi 2
3.061467 is the approximation of pi 3
3.121445 is the approximation of pi 4
3.136548 is the approximation of pi 5
3.140331 is the approximation of pi 6
3.140331 is the approximation of pi
pi 3.141592653589793238462643383...
m_pi=3.14159265358979312
v_pi=2.82842712474618985 4
v_pi=3.06146745892071825 3
v_pi=3.12144515225805197 2
v_pi=3.13654849054593887 1
v_pi=3.14033115695475251 0
pi 3.141592653589793238462643383...
Возможны дополнительные незначительные упрощения.