Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5.  
  6. int Geometric_Progression(double a, double q, int n, // Premise
  7. double* n_member, double* n_sum);// Results
  8.  
  9. int main()
  10. {
  11. //a – первый член,
  12. //q – знаменатель,
  13. double a, q;
  14. //n – номер искомого члена прогрессии)
  15. int n;
  16.  
  17. scanf("%lf", &a);
  18. scanf("%lf", &q);
  19. scanf("%ld", &n);
  20.  
  21. double n_member, n_sum;
  22.  
  23. switch (Geometric_Progression(a, q, n, &n_member, &n_sum))
  24. {
  25. case 0:
  26. printf("%d\n%f\n%f\n", 0, n_member, n_sum);
  27. break;
  28. case 1:
  29. printf("n - negation\n");
  30. //printf("n - отрицательное\n");
  31. break;
  32. case 2:
  33. printf("+- progression\n");
  34. //printf("Знакочередующаяся прогрессия\n");
  35. printf("%d\n%f\n%f\n", 2, n_member, n_sum);
  36. break;
  37. case 3:
  38. //printf("Вырожденная прогрессия\n");
  39. printf("Viroshjdennaya progression\n");
  40. printf("%d\n%f\n%f\n", 3, n_member, n_sum);
  41. break;
  42. }
  43. return 0;
  44. }
  45.  
  46. // 0 - ничего такого.
  47. // Если возвращаем 1, то n отрицательный,
  48. // если 2, то знакочередующаяся,
  49. // а если 3, то вырожденная.
  50. int Geometric_Progression(double a, double q, int n,
  51. double *n_member, double *n_sum) {
  52. int global = 0;
  53.  
  54. //Отслеживаем неположительный n
  55. if (n < 0)
  56. return 1;
  57.  
  58. //Находим всё по формулам, а дальше смотрим исключительные ситуации.
  59. *n_member = a*pow(q, n - 1);
  60. *n_sum = a*(pow(q, n) - 1)/(q - 1);
  61.  
  62. //А теперь считаем элементы прогрессии,
  63. //чтобы отловить 2-ой и 3-ий случай.
  64. double member = a;
  65. int sign = a >= 0? 1 : 0;
  66. int case2 = 2, case3 = 3;
  67.  
  68. //20 значений хватит, чтобы проверить все случаи.
  69. for (int i = 0; i < 20; i++)
  70. {
  71. //Проверка на 3-ий случай.
  72. if (case3 != 0 && member != member * a)
  73. case3 = 0;
  74.  
  75. member *= a;
  76.  
  77. //Проверка на 2-ий случай.
  78. if (case2 != 0, sign != member >= 0 ? 1 : 0)
  79. case2 = 0;
  80. else if (case2 != 0) sign = -sign;
  81. }
  82.  
  83. return global + case2 + case3;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement