Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Bob2
1 / 1 / 0
Регистрация: 31.07.2012
Сообщений: 5
#1

Дано действительное а Найти такое наименьшее n, что - C++

01.08.2012, 07:37. Просмотров 1616. Ответов 20
Метки нет (Все метки)

1+ 1/2+...1/n a
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2012, 07:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дано действительное а Найти такое наименьшее n, что (C++):

Дано вещественное число a. Найти такое наименьшее n, что 1+1/2+1/3+.+1/n>a - C++
Дано вещественное число a. Найти такое наименьшее n, что 1+1/2+1/3+...+1/n>a. (С++)

Найти такое наименьшее N, что 1 + 1/2 + 1/3 + 1/4 + 1/N больше b - C++
1. Вводится действительное число b. Найти такое наименьшее N, что 1 + 1/2 + 1/3 + 1/4 + 1/N больше b.

Найти наименьшее значение m такое что 2m>n с использованием циклов - C++
Вводится натуральное число n. Найти наименьшее значение m, такое что 2m>n. Например: 1) Ввели n = 999 2) Вывели на экран m = 10 ...

Найти такое наименьшее n, что сумма 1/i больше заданного А (Dev-C++) - C++
Здравствуйте уважаемые господа, взываю к вашей помощи, вот условие задачи: Дано действительное число а. Найти такое наименьшее n, что...

Дано положительное число А > 10. Найти такое k, что (k-1)! <= A < k - C++
Я здесь новичок, помогите,пожалуйста, с программой! Дано положительное число А&gt;10. Найти такое k, что (k-1)!&lt;=A&lt;k. Спасибо заранее. ...

Найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N - C++
Требуется найти наименьшее натуральное число Q такое, что произведение его цифр равно заданному числу N. Входные данные В...

20
Catstail
Модератор
22903 / 11269 / 1832
Регистрация: 12.02.2012
Сообщений: 18,481
01.08.2012, 10:21 #2
Вероятно, имеется в виду (1+1/2+1/3+...+1/n) > a ? Хорошая задача...
Я бы сказал - очень хорошая задача! Такое n существует, т.к. ряд Ʃ(1/n) расходится. Но найти его тупым перебором будет сложно: если просто суммировать с единицы и ждать, пока сумма превысит a, то можно и не дождаться, т.к. погрешность округления все съест. Суммировать нужно "с другого конца", но он-то и неизвестен.
1
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 10:35 #3
Цитата Сообщение от Bob2 Посмотреть сообщение
Дано действительное а Найти такое наименьшее n, что
1+ 1/2+...1/n a
- ИМХО архитривиальная задача
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
int main()
{
    int a = 0;
    int n = 0;
    double sum  = 0;//Áóäåò ñîäåðæГ*ГІГј Г·Г*Г±ГІГЁГ·Г*ГіГѕ ñóììó ðÿäГ*
    cout<<"a = ";cin>>a;
    for(n = 1; sum < a; n++)
    {
        system("cls");
        //ÑäåëГ*Г« ГЁГ*äèêГ*öèþ Г°Г*áîòû ÷òîáû Г*ГҐ Г§Г*Г±Г*ГіГІГј
        cout<<"a = "<<a<<endl;
        cout<<"n = "<<n<<" sum = "<<sum<<endl;
        sum = sum + 1.0/n;
    }
    system("pause");
    return 0;
}
1
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
Catstail
Модератор
22903 / 11269 / 1832
Регистрация: 12.02.2012
Сообщений: 18,481
01.08.2012, 10:37 #4
Нет, Юра... Возьми, например, a=10000 и найди n.
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 10:51 #5
Цитата Сообщение от Catstail Посмотреть сообщение
Нет, Юра... Возьми, например, a=10000 и найди n.
- Таки Да, просто число для 10000 будет сильно большим, возможно точности дабла не хватит, можно 1000-чу или лучше 100, для этого варианта сейчас выложу код.

Добавлено через 4 минуты
Catstail, вот тебе код, если есть куча времени скажешь при каком n сумма была немногим меньше 10000
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
    int a = 0;
    double n = 0;
    double sum  = 0;//Áóäåò ñîäåðæГ*ГІГј Г·Г*Г±ГІГЁГ·Г*ГіГѕ ñóììó ðÿäГ*
    cout<<"a = ";cin>>a;
    for(n = 1; sum < a; n = n + 1)
    {
        system("cls");
        //ÑäåëГ*Г« ГЁГ*äèêГ*öèþ Г°Г*áîòû ÷òîáû Г*ГҐ Г§Г*Г±Г*ГіГІГј
        cout<<"a = "<<a<<endl;
        cout<<"n = "<<n<<" sum = "<<sum<<endl;
        sum = sum + 1.0/n;
    }
    system("pause");
    return 0;
}
- он всё посчитает, когда сам дождусь отработки для 100-ни приложу аттачам скриншот

Добавлено через 1 минуту

Не по теме:

Пока у меня хватило времени дождаться 9500 итераций и суммы 9,73 но сумма растёт, так что наивно полагать что не посчитаем

0
Catstail
Модератор
22903 / 11269 / 1832
Регистрация: 12.02.2012
Сообщений: 18,481
01.08.2012, 12:33 #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
но сумма растёт, так что наивно полагать что не посчитаем
- увы, это не совсем так. Посчитаем, но ЧТО? Попробуйте посчитать синус из его разложения в ряд (типовой алгоритм - с заданной точностью) для аргумента x, равного, скажем 10000. Ряд "сойдется", но синус будет больше единицы...
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 13:16 #7
Catstail, мы считаем бесконечную сумму, ряд 1/n расходиться а следовательно предел его суммы равен бесконечности, таким образом для какого нибудь 150 тысячного n накомпленная сумма превзойдёт 100, а для 3млн 2-го превзойдёт 1000-чу. Я чётко и ясно написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Catstail, вот тебе код, если есть куча времени скажешь при каком n сумма была немногим меньше 10000- он всё посчитает
- почему даже не удосужился слинковать и запустить?!За те 3 часа которые прошли между нашим обзением программа спокойно бы досчитала и до 10000 тыс, но как я вижу тут уже играет свою роль простая лень

Добавлено через 6 минут
для аргумента x, равного, скажем 10000. Ряд "сойдется", но синус будет больше единицы...
- во первых все разложения в ряд Тейлора валидны для |x| < 1 во вторых sin(1000) = sin(1000%2pi) = sin(1000-159*2*pi) ~ sin(0.009)
0
-=ЮрА=-
Заблокирован
Автор FAQ
01.08.2012, 13:21 #8
Терпения у меня хватило для 10-ки, но алгоритм отпашет до самого MAX_DOUBLE потом конечно крах, если при этом n а оно составит порядка 1E308 мы не наберём 10000 это не значит что этого числа достичь в принципе не возможно - делаем long double помощней CPU и вперёд. Для ускорения работы предлагаю всем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
system("cls");
сделать комент вот этого
1
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
-=ЮрА=-
01.08.2012, 14:03
  #9

Не по теме:

Catstail, вот ссылка на более быстрый в плане работы код
http://liveworkspace.org/code/9f50e95f268ce9cb41b44e2515c6c852

n = 2.97e+08 sum = 20.0865
- сидеть ещё E+10-15 знаков у меня просто нет времени...

1
Catstail
Модератор
22903 / 11269 / 1832
Регистрация: 12.02.2012
Сообщений: 18,481
01.08.2012, 15:29 #10
Юра, ты прав!!! Это я ступил. В этой задаче нет накопления ошибки, поскольку отсутствует вычитание близких чисел (в отличие от ряда для синуса). Поэтому вычисления - действительно только вопрос времени, а задача достаточно тривиальна.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
во первых все разложения в ряд Тейлора валидны для |x| < 1
- нет, ряд сходятся для любого x (факториал в знаменателе уверенно давит степень). Для точности double можно убедиться, что приличная точность получается для x до сотни. Но все это не имеет отношения к Теме. Твое решение верно.
0
-=ЮрА=-
01.08.2012, 15:37
  #11

Не по теме:

Catstail, для синуса аргумент должен быть по модулю менее единицы и так почти для всех разложений http://ru.wikipedia.org/wiki/Ряд_Тейлора везде |x| < 1
Для x с модулем больших единицы ряды будут расходиться

0
Catstail
Модератор
22903 / 11269 / 1832
Регистрация: 12.02.2012
Сообщений: 18,481
01.08.2012, 18:24 #12
Не могу согласиться. Дело в другом. Вот натурный эксперимент:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "iostream.h"
#include "math.h"
 
double cos_(double x, double eps)
{
   double s,n,a;
   a=1;
   s=1;
   n=0;
   while (1)
   {
    if (fabs(a) <= eps) break;
    a=-a*x*x/((2*n+1)*(2*n+2));
    s=s+a;
    n++;
   }
   return s;
}
 
int main(int argc, char* argv[])
{
   double x;
   for (x=0; x < 50; x+=1)
    //cout << x << endl << cos(x) << endl << cos_(x,1.0E-13) << endl << endl;
    cout << "x=" << x << " Diff=" << fabs(cos(x)-cos_(x,1.0E-14)) << endl;
   return 0;
}
Здесь считается косинус (разложением в ряд). Суммирование идет до тех пор, пока очередной член ряда не станет меньше заданного eps. Потом в цикле исследуется разность между стандартным косинусом и нашим. И что же? Примерно до значений аргумента 25 все просто прекрасно. Потом погрешность становится заметной, а потом и вовсе неприемлемой. В чем дело? Если бы ряд расходился при x > 1, как удается дойти до 25?
2
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 14:13 #13
Catstail, разница в 13339, для х = 49 не настороживает?Меня вот сильно, притом погрешность для х больших единицы растёт в геометрической прогрессии, интересно а какая разница будет между cos(100) - cos_(100,1.0E-14) - это как раз то о чём я говорил. Кстати есть такая штука, как зависимость точности разложения от модуля переменной, так вот чем больше модуль тем хуже разложение описывает истинное значение функции - вот как раз значения за 50 яркий тому пример.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2012, 15:21 #14
Catstail, ниже продолжение твоей таблицы и ты будешь говорить что для значений больших 1 ряд cos(x) сходиться???!Да нам повезло до х = 25-30 отклонение ещё не очень велико, а потом...?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double Taylor(double x, double eps)
{
    double sum = 0;
    double an  = 1;
    double n   = 0;
    while(eps < fabs(an))
    {
        sum = sum + an;
        an *= (-1)*x*x/((2*n + 1)*(2*n + 2));
        n   = n + 1;
    }
    return sum;
}
 
int main()
{
    double x;
    cout<<"x\tcos(x)\tTaylor\n";
    for(x = 50; x < 100; x += 1)
        cout<<x<<"\t"
            <<setw(6)<<setprecision(3)<<cos(x)<<"\t"
            <<setw(6)<<setprecision(3)<<Taylor(x,1E-6)<<endl;
    return 0;
}
http://codepad.org/VmyRCt5l
1
Миниатюры
Дано действительное а Найти такое наименьшее n, что  
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
02.08.2012, 15:50 #15
Естественно, это неизбежно, если представлять косинус как частичную сумму разложения в ряд Тейлора (точнее, ряд Маклорена). Именно поэтому внутри компьютера по разложению Тейлора вычисляется значение в пределах, например (–π/8, π/8), а для больших значений угла значение функции получается с помощью тождественных преобразований (периоды, половинные аргументы и т. п.).
0
02.08.2012, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 15:50
Привет! Вот еще темы с ответами:

Для заданного x найти наименьшее k такое, что m(k) ≤ x ≤ m(k+1) - C++
Задание: Элементы массива M(n) упорядочены по неубыванию. Для заданного x найти наименьшее k такое, что mk ≤ x ≤ mk+1, либо показать...

Дано натуральное число m. Найти такое натуральное n, что двоичная запись n получается из двоичной записи m изменением порядка цифр на обратный ( - C++
Дано натуральное число m. Найти такое натуральное n, что двоичная запись n получается из двоичной записи m изменением порядка цифр на...

Дано действительное E>0. Найти первый член y[n], для которого выполнено y[n]-y[n-1]<E - C++
Здравствуйте! Нужно решить задачу на C++: Пусть, y=0 y=(y+1)/(y+2) k=1,2,... Дано действительное E&gt;0. Найти первый член y, для...

Для данного натурального числа n определите такое наименьшее целое k, что... - C++
Для данного натурального числа n определите такое наименьшее целое k, что 2k≥n. Например, при вводе числа 7 программа должна вывести 3. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.