Есть ли более простой способ сделать это?Как я могу избавиться от одной из моих петель времени? - PullRequest
0 голосов
/ 03 октября 2018

Для моего задания CS нам было предложено создать программу для аппроксимации числа пи с использованием Формула Viete .Я сделал это, однако, мне не совсем нравится мой код, и мне было интересно, есть ли способ сделать это без использования двух циклов while.

(Мой профессор просит нас использовать цикл while, поэтому я хочу оставить хотя бы один!)

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
  double n, x, out, c, t, count, approx;
  printf("enter the number of iterations to approximate pi\n");
  scanf("%lf", &n);

  c = 1;
  out = 1;
  t = 0;
  count = 1;
  x = sqrt(2);

  while (count<=n)
  { 
      t=t+1;

      while (c<t)
      { 
          x=sqrt(2+x);
          c=c+1; 
      }

      out=out*(x/2);
      count=count+1; 
  }

  approx=2/out;
  printf("%lf is the approximation of pi\n", approx);
} 

Я просто чувствую, что мой код может быть как-то проще, но яЯ не уверен, как это упростить.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Рассмотрим, сколько раз внутренний цикл выполняется на каждой итерации внешнего цикла

  • на первой итерации, он не запускается вообще (c == t == 1)
  • на каждой последующей итерации, он запускается ровно один раз (так как t был увеличен один раз с последней итерации внешнего цикла).

Таким образом, вы можете заменить это внутреннее время на if:

    if (count > 1) {

после того, как вы это сделаете, t и c совершенно не нужны и могут быть исключены.

Если вы измените начальное значение x (перед циклом),Вы можете рассчитать здесь первую итерацию, избавившись, таким образом, от if.Это оставляет минимальный цикл:

out = 1;
count = 1;
x = 0;
while (count<=n) {
    x=sqrt(2+x);
    out=out*(x/2);
    count=count+1; 
}
0 голосов
/ 03 октября 2018

Мне просто кажется, что мой код может быть как-то проще, но я не уверен, как его упростить.

Мне не нравится тот факт, что я использую два цикла 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...

Возможны дополнительные незначительные упрощения.

...