Вычислить с максимальной точностью значение суммы k элементов

Автор работы: Пользователь скрыл имя, 14 Июня 2013 в 20:53, курсовая работа

Описание работы

Для того чтобы решить эту задачу точно, нужно понимать, на каких этапах вычисления значения суммы может возникать погрешность. Так как нас интересует лишь целая часть от логарифма натурального числа, то использовать операцию отбрасывания дробной части от значения логарифма, полученного в вещественной арифметике, также нельзя. В противном случае мы можем получить, например, для 4 вещественное значение 1.9999999999, целая часть которого равна единице, вместо требуемой двойки. Поэтому вычисление целой части логарифма числа следует проводить в цикле, используя исключительно целочисленную арифметику.

Содержание работы

1. Постановка задачи 3
2. Словесный алгоритм решения задачи 4
3. Блок-схема программы 5
4. Документация программы 7
4.1. Описание форматов входных данных 7
4.2. Комментарии к входным данным 7
4.3. Комментарии к выходным данным 7
4.4. Текст программы 7
5. Результаты работы программы 11
6. Литература 12

Файлы: 1 файл

ПЗ.doc

— 101.00 Кб (Скачать файл)

Титульник 

Содержание

 

 

 

  1. Постановка задачи

 

Вычислить с максимальной точностью значение суммы элементов, вычисляемых следующим выражением: , где , а изменяется от 1 до 100.

 

 

  1. Словесный алгоритм решения задачи

 

Для того чтобы  решить эту задачу точно, нужно понимать, на каких этапах вычисления значения суммы может возникать погрешность. Так как нас интересует лишь целая часть от логарифма натурального числа, то использовать операцию отбрасывания дробной части от значения логарифма, полученного в вещественной арифметике, также нельзя. В противном случае мы можем получить, например, для 4 вещественное значение 1.9999999999, целая часть которого равна единице, вместо требуемой двойки. Поэтому вычисление целой части логарифма числа следует проводить в цикле, используя исключительно целочисленную арифметику.

То же замечание  касается и возведения тройки в целую  степень. Заметим, что при  принимает значения от 1 до 6. Следовательно, сто обыкновенных дробей, которые требуется сложить, имеют всего 6 различных знаменателей: 3, 32, 33, … 36,причем наименьшим общим знаменателем этих дробей является 36 (это число “короткое”). Поэтому несложно привести все 100 дробей к общему знаменателю и, используя лишь целочисленную арифметику, получить значение числителя и знаменателя результирующей дроби. Для перехода от обыкновенной дроби к десятичной можно воспользоваться алгоритмом деления “короткого” числа на “короткое” и определить точное значение искомой суммы.

 

 

  1. Блок-схема программы

 

Вычисление  целой части логарифма.

 

Вычисление  степени целого числа.

Основная программа.

 

 

  1. Документация программы

    1. Описание форматов входных данных

 

Переменная

Тип

Назначение

K

longint

Количество слагаемых в сумме


    1. Комментарии к входным данным

Значение переменной (количество слагаемых в сумме) должно быть в диапазоне .

    1. Комментарии к выходным данным

 

Переменная

Тип

Назначение

Sum

Real

Искомая сумма


    1. Текст программы

 

На языке Pascal.

uses Crt;

var k, n, max, i, d: longint;

    sum: real;

 

{ Вычисляем  целую часть логарифма }

function IntLog(a: longint): longint;

var g: integer;

begin

  g := -1;

  while a <> 0 do

  begin

    Inc(g);

    a := a shr 1;

  end;

  IntLog := g;

end;

 

{ Вычисляем  a^b }

function Power(a, b: longint): longint;

var g, i: longint;

begin

  g := 1;

  for i := 1 to b do

    g := g * a;

  Power := g;

end;

 

begin

  ClrScr;

  Write('Введите значение k (1<=k<=100): '); ReadLn(k);

  { Вычисляем максимальную степень n }

  max := IntLog(k);

  { Вычисляем  максимальный общий знаменатель  }

  d := Power(3, max);

  sum := 0;

  { Вычисляем  сумму числителей }

  for i := 1 to k do

    sum := sum + i * Power(3, max - IntLog(i));

  { Делим на знаменатель }

  sum := sum / d;

  Write('Сумма = ', sum);

  ReadKey;

end.

 

На языке C++.

#include "conio.h"

#include "iostream.h"

 

long k, n, max, i, d;

float sum;

 

// Вычисляем  целую часть логарифма

long IntLog(long a)

{

  long g = -1;

  while (a != 0)

  {

    ++g;

    a = a >> 1;

  }

  return g;

}

 

// Вычисляем  a^b

long Power(long a, long b)

{

  long g = 1, i;

  for (i = 1; i <= b; i++)

    g = g * a;

  return g;

}

 

void main(void)

{

  clrscr();

  cout << "Введите значение k (1<=k<=100): "; cin >> k;

  // Вычисляем максимальную степень n

  max = IntLog(k);

  // Вычисляем  максимальный общий знаменатель

  d = Power(3, max);

  sum = 0;

  // Вычисляем  сумму числителей

  for (i = 1; i <= k; i++)

    sum = sum + 1.0 * i * Power(3, max - IntLog(i));

  // Делим на знаменатель }

  sum = 1.0 * sum / d;

  cout << "Сумма = " << sum;

  while (!kbhit()) {;}

}

 

 

  1. Результаты работы программы

 

 

 

 

 

 

  1. Литература

 

  1. Фаронов В.В., «Turbo Pascal 7.0. Практика программирования», 2009 г., КноРус,416 с.
  2. Павловская Т.А., «Паскаль. Программирование на языке высокого уровня», 2007 г., Питер, 393 с.
  3. Меженный О.А., «Turbo Pascal», 2008 г., Вильямс Диалектика, 336 с., ил.
  4. Сухарев М., «Turbo Pascal 7.0. Теория и практика программирования», 2007 г., Наука и техника, 544 с., ил.
  5. Гордон Я., «Тонкости программирования на языке Паскаль», 2006 г., Бук-Пресс, 320 с.
  6. Валерий Фаронов, «Turbo Pascal»,2006 г., БХВ-Петербург, 1056 с.
  7. Алексеев Е.Р., Чеснокова О.В., Павлыш В.Н., «Турбо Паскаль 7.0», 2006 г., НТ Пресс, 272 с., ил.
  8. Джесс Либерти, «Освой самостоятельно C++. 10 минут на урок», 2005 г., Вильямс, 352 стр., с ил.
  9. Николас A. Солтер, Скотт Дж. Клепер, «Язык программирования C++ для профессионалов. Си», 2006 г., Диалектика, 912 стр., с ил.
  10. Н. Н. Мартынов, «Программирование для Windows на С/С++», 2009 г., Бином-Пресс, 480 с.

Информация о работе Вычислить с максимальной точностью значение суммы k элементов