Автор работы: Пользователь скрыл имя, 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 до 100.
Для того чтобы решить эту задачу точно, нужно понимать, на каких этапах вычисления значения суммы может возникать погрешность. Так как нас интересует лишь целая часть от логарифма натурального числа, то использовать операцию отбрасывания дробной части от значения логарифма, полученного в вещественной арифметике, также нельзя. В противном случае мы можем получить, например, для 4 вещественное значение 1.9999999999, целая часть которого равна единице, вместо требуемой двойки. Поэтому вычисление целой части логарифма числа следует проводить в цикле, используя исключительно целочисленную арифметику.
То же замечание касается и возведения тройки в целую степень. Заметим, что при принимает значения от 1 до 6. Следовательно, сто обыкновенных дробей, которые требуется сложить, имеют всего 6 различных знаменателей: 3, 32, 33, … 36,причем наименьшим общим знаменателем этих дробей является 36 (это число “короткое”). Поэтому несложно привести все 100 дробей к общему знаменателю и, используя лишь целочисленную арифметику, получить значение числителя и знаменателя результирующей дроби. Для перехода от обыкновенной дроби к десятичной можно воспользоваться алгоритмом деления “короткого” числа на “короткое” и определить точное значение искомой суммы.
Вычисление целой части логарифма.
Вычисление степени целого числа.
Основная программа.
Переменная |
Тип |
Назначение |
K |
longint |
Количество слагаемых в сумме |
Значение переменной (количество слагаемых в сумме) должно быть в диапазоне .
Переменная |
Тип |
Назначение |
Sum |
Real |
Искомая сумма |
На языке 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()) {;}
}
Информация о работе Вычислить с максимальной точностью значение суммы k элементов